如何从命令行使用REG_EXPAND_SZ?

我正在阅读有关修改Windowsregistry的命令的Windows命令行文档(Win + F1),特别是“reg add”命令。

reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d "%systemroot%\system32" 

现在,我不知道这是如何devise的。 当我调用上面的命令时,variables%systemroot%被扩展到C:\Windows 。 我试过以下不是让variables扩大,但我不能强迫它不要:

  • 用`%,^,“`转义'%%“ – 即使我用双引号也不行
  • 在整个/ dstring周围使用单引号“'
  • 使用`setlocal setdelayedexpansion`? 如:

# (setlocal enabledelayedexpansion) && (reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d "!systemroot!\system32") && (setlocal disabledelayedexpansion)

variables'data'(/ d)字段或者像^%systemroot^%或者像!systemroot! 或者只是扩展到C:\ windows。 我可能可以使用.reg文件来完成我的任务,但我根本不想这样做。
我想可能是我用来显示variables内容的程序有问题( regedit / regedt32 / reg query (commandline) ),但是检查完后可能不是这种情况。
有任何想法吗? 我主要感兴趣的是variables值应该如何在regedit窗口中看起来像是: "%systemroot%\system32"还是"C:\windows\system32"要被其他程序正确扩展。 问候。

Solutions Collecting From Web of "如何从命令行使用REG_EXPAND_SZ?"

从命令行,这对我工作:

 reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d ^%systemroot^%\system32 

没有引号就像你发现的那样,提出了安逸的语法是正确的。 但是当你需要空间时,你会遇到麻烦。

但是,可以在值中混入引号。 它看起来很奇怪,但它的作品:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d ^%SystemRoot^%;c:\ Program" Files" \Intel\DMIX;C:\bin /t REG_EXPAND_SZ

你可以在需要的地方使用引号,而不是在你的变量周围。 而不是在反斜杠后。

另外,请注意,在批处理文件中使用的语法与命令行上的语法不同。 如果将该行放入批处理文件中,则需要用另一个“%”替换“^”:

 REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d %%SystemRoot%%;c:\Program" Files"\Intel\DMIX;C:\bin /t REG_EXPAND_SZ 

(cmd.exe总是让我想起Henry Spencer的话: “那些不了解Unix的人被谴责重新创造它”

我认识到这是一个古老的线索,但由于似乎没有答案,我也被这个问题所逼,所以我会分享我所提出的。 这是复杂的,这是丑陋的,它看起来像这样:

SET VAR =%SET SET VALUE =%VAR%SystemRoot%VAR%\ system32 … REG ADD HKLM … / v Test / t REG_EXPAND_SZ / d%VALUE%

我最终包含字符串%SystemRoot%\system32

编辑:应该在发布之前完成测试。 虽然这从命令行工作,它在我的命令脚本失败。 什么DID工作是SET VALUE=%%SystemRoot%%\system32...

我们在autounattend.xml中有用。 我是第一个跟随幸福的答案,然后我不得不使用mivk的增强的答案。 我有它的工作。 然后,我做了一个小小的改变,停止了工作。 我认为这种洞察值得报道,挽救他人冗长的挫折感。

建立在以前的答案,这里是如何使这个工作在autounattend.xml:

 <CommandLine>cmd.exe /c reg.exe add HKLM\ourkey /v ourvalue /t REG_EXPAND_SZ /d "our data with spaces"^%USERNAME^%"and more spaces" /f</CommandLine> 

重要的是cmd.exe / c。 如果你不使用cmd.exe,那么reg.exe仍然会运行,但是它将^%注入到注册表中,而不是所需的%。

也许ASTX813的答案会起作用,但这似乎更容易阅读。

这里没有什么魔法,你必须通过/ become:%%命令行中的每一个%。

在批处理文件中,您必须再次将它们转义,变成%%%% SystemRoot %%%%。 是的,四个&符号。 这是丑陋的,但它是这样的,它是相当一致的。

注意:使用^作为文字字符来转义它可能只帮助/清除一个步骤/度(只要它不被解释)。 使用^的优点是可以使用相同的语法在命令行或批处理文件中编写:例如。 “^%SytemRoot ^%”,因为在这两种环境中,%都等同于文字。

答案很简单。 只引用空格并转义%。

在命令行中,使用^转义%。

 reg add HKLM\Software\Microsoft\Command" "Processor /v AutoRun /t REG_SZ /d title" "^%username^% /f 

在批处理文件中,用另一个%转义%。

 reg add HKLM\Software\Microsoft\Command" "Processor /v AutoRun /t REG_SZ /d title" "%%username%% /f 

这花了我一段时间才弄清楚。 在我看来,我应该引用整个字符串,但不能让变量传递而不扩展它。 我通过引用空格来打破思维方式。

请尝试以下操作:

reg add HKCU \ testfolder / t REG_EXPAND_SZ / v Stokrotka / d ^%systemroot%^ \ system32