我正在阅读有关修改Windows注册表的命令的Windows命令行文档(Win + F1),特别是“reg add”命令。
reg add HKCU\testfolder /t REG_EXPAND_SZ /v Stokrotka /d "%systemroot%\system32"
现在,我不知道这是如何设计的。
当我调用上面的命令时,变量%systemroot%
会扩展为C:\Windows
。我试过以下不要让变量扩展,但是我没办法强迫它不要:
# (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"
那样由其他程序正确扩展。
问候。
答案 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
编辑:应该在发布之前完成测试。虽然这在命令行中起作用,但在命令脚本中失败了。 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