如何从命令行使用REG_EXPAND_SZ?

时间:2010-09-01 16:56:16

标签: windows command-line batch-file

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

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

现在,我不知道这是如何设计的。 当我调用上面的命令时,变量%systemroot%会扩展为C:\Windows。我试过以下不要让变量扩展,但是我没办法强迫它不要:

  • 使用`%,^,\`转义`%%` - 即使我使用双引号也无效
  • 在整个/ d字符串周围使用单引号''
  • 使用`setlocal setdelayedexpansion`? ......喜欢:

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

变量'data'(/ d)字段可以是^%systemroot^%或类似!systemroot!,也可以只扩展为C:\ windows。 我可能会使用.reg文件来完成我的任务,但我根本不想这样做 我认为可能用于显示变量内容(regedit / regedt32 / reg query (commandline))的程序有问题,但在检查后可能不是这种情况。
有任何想法吗?我主要感兴趣的是变量值在regedit窗口中应该是什么样子,如果它像"%systemroot%\system32""C:\windows\system32"那样由其他程序正确扩展。 问候。

10 个答案:

答案 0 :(得分:5)

从命令行,这对我有用:

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

答案 1 :(得分:3)

aphoria建议的语法是正确的,没有你发现的引号。但是当你在值中需要空格时会遇到麻烦。

但是, 可以在值中混合使用引号。它看起来很奇怪,但它确实有效:

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的人被谴责重新发明它,很糟糕”

答案 2 :(得分:1)

我认识到这是一个老线程,但由于似乎没有答案,我也被这个问题所驱使,我将分享我的想法。这是令人费解的,它很难看,看起来像这样:

  

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

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

的Test

编辑:应该在发布之前完成测试。虽然这在命令行中起作用,但在命令脚本中失败了。 DID的工作原因是SET VALUE=%%SystemRoot%%\system32...

答案 3 :(得分:1)

我们在autounattend.xml中使用。我是第一次听到aphoria的回答,然后我不得不使用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的答案可行,但这看起来更容易阅读。

答案 4 :(得分:0)

这里没有魔法,你必须使用/ become:%%来逃避命令行中的每一个%。

在批处理文件中,您必须再次转义它们,成为%%%% SystemRoot %%%%。是的,四个&符号。它很丑陋,但它的方式却是如此,而且它非常一致。

注意:使用^将其作为文字字符进行转义可能仅在一个步骤/度数中帮助/清理(只要它不被解释)。使用^的优点是您可以使用相同的语法编写命令行或批处理文件:例如。 &#34; ^%SytemRoot ^%&#34;,因为在这两种环境中,%同等对待为文字。

答案 5 :(得分:0)

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

在命令行中,使用^。

转义%'
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

我花了一段时间才弄明白。在我看来,我应该引用整个字符串,但无法在不扩展它的情况下传递变量。我通过引用空格来打破我的思维方式。

答案 6 :(得分:0)

请尝试以下方法:

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

答案 7 :(得分:0)

从批处理文件中,您最终会出现引号问题,然后您可以使用反斜杠转义,例如:

<?php
// URL Connection
$host='localhost';
$uname='root';
$pwd='';
$db='databasename';
//I created a connection object here to establish the connection with my database 
$con = mysql_connect($host,$uname,$pwd) or die("connection failed/");
mysql_select_db($db,$con) or die("db selection failed");
?>

答案 8 :(得分:0)

不带引号

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

带引号

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

答案 9 :(得分:0)

我终于对CScript上的标语/徽标感到厌倦,并决定在我的“新建”批处理脚本中为VBS关联添加//nologo作为前缀。这需要使用环境变量来修改REG_EXPAND_SZ注册表项,而这个问题及其各种答案是我能找到的最佳灵感。这是最终的脚本。

SET "thecmd=\""%%SystemRoot%%\System32\CScript.exe\"" //nologo \""%%1\"" %%*"
ECHO.%thecmd%
REG.exe ADD "HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command" /ve /t REG_EXPAND_SZ /d "%thecmd%" /f
SET thecmd=

将命令存储在变量中并为\""使用"和为%%使用%都是可以的。

如果您希望使用单线(再次批量生产),则可以使用:

REG.exe ADD "HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command" /ve /t REG_EXPAND_SZ /d "\""%%SystemRoot%%\System32\CScript.exe\"" //nologo \""%%1\"" %%*" /f

如果您想要相同的功能,请不要忘记将VBSFile的动词设置为Open2,这样您就可以双击VBS文件以使用CScript运行它们:

REG.exe ADD "HKEY_CLASSES_ROOT\VBSFile\Shell" /ve /t REG_SZ /d "Open2" /f