![如何使用 SETX 在批处理代码中设置注册表变量?](https://linux22.com/image/1584542/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20SETX%20%E5%9C%A8%E6%89%B9%E5%A4%84%E7%90%86%E4%BB%A3%E7%A0%81%E4%B8%AD%E8%AE%BE%E7%BD%AE%E6%B3%A8%E5%86%8C%E8%A1%A8%E5%8F%98%E9%87%8F%EF%BC%9F.png)
我正在尝试制作一个与 Steam 配合使用的自定义工具。由于用户的安装目录可能与我不同,因此我想使用SteamPath
注册表字符串值作为批处理代码中的变量来获取正确的路径。我尝试使用以下代码来制作我的自定义STEAMDIR
变量:
@ECHO OFF
SETX STEAMDIR /K "HKEY_CURRENT_USER\Software\Valve\Steam\SteamPath" /m
IF NOT EXIST "STEAMDIR" GOTO :NOSTEAM
IF EXIST "STEAMDIR" GOTO :FOUND
:FOUND
CLS
SET msgboxTitle=Success!
SET msgboxBody=Steam found!
SET tmpmsgbox=%TEMP%\Message.vbs
IF EXIST "%tmpmsgbox%" DEL /F /Q "%tmpmsgbox%"
ECHO msgbox "%msgboxBody%",0,"%msgboxTitle%">"%tmpmsgbox%"
WScript "%tmpmsgbox%"
GOTO :END
:NOSTEAM
CLS
SET msgboxTitle=Error!
SET msgboxBody=You don't kave any Kenshi workshop mods installed!
SET tmpmsgbox=%TEMP%\Message.vbs
IF EXIST "%tmpmsgbox%" DEL /F /Q "%tmpmsgbox%"
ECHO msgbox "%msgboxBody%",0,"%msgboxTitle%">"%tmpmsgbox%"
WScript "%tmpmsgbox%"
GOTO :END
:END
我将SETX
按照所示使用这SS64 页面,但我的尝试失败了。任何帮助都值得感激,但我想问一下使用 PowerShell 或 VisualBasic 的解决方案不是建议。我经常遇到这种情况,而且我没有足够的语言经验来重写我的代码,因为我还有一些东西要添加。
答案1
您之前的表述更好。除了 Grawity 所指出的问题之外,您在使用该
for /f
命令时遇到的主要问题是它会为每个标记生成单独的变量。
对于 的值c:/program files (x86)/steam
,您将拥有:
%%a=c:/program files
%%b=(x86)/steam
您需要使用如下代码来累积值%%a
等%%b
:
setlocal EnableDelayedExpansion
for /f "usebackq tokens=3*" %%a in (`reg query "HKCU\Software\Valve\Steam" /V "SteamPath" ^| find "REG_SZ"`) do (
set STEAMDIR=%%a
set b=%%b
set c=%%c
)
if "%b%" neq "%%b" set STEAMDIR=%STEAMDIR% %b%
if "%c%" neq "%%c" set STEAMDIR=%STEAMDIR% %c%
echo STEAMDIR=%STEAMDIR%
为了完整性,我添加了对第三个组件的检查,尽管没有针对您的值的检查。
答案2
你有:
SET %STEAMDIR%=for /f "tokens=3" %%a in [...] do echo %%a
%
第一个问题是左侧的用法。在批处理脚本中,百分号不是变量名称的一部分;它们是触发扩张该变量。您不希望它们位于赋值的左侧(特殊情况除外),因为当前您的命令会扩展为以下内容 - 它会尝试设置一个没有名称的变量:
SET =for /f "tokens=3" %%a in [...] do echo %%a
正确的用法(SET
而不是整个的)是:
SET STEAMDIR=for /f "tokens=3" %%a in [...] do echo %%a
第二个问题是变量赋值的右侧是价值。这不是产生该值的命令。你实际上是将变量的内容设置为字符for /f ...
其他语言具有函数或“命令替换”运算符,允许运行命令并将其输出用作外部命令的值(例如var=`cmd`
或var=$(cmd)
在 bash 中),但 Windows Cmd.exe 实际上没有此功能。
相反,for /f ...
调用获取输出并运行内部命令( 之后的部分do
),然后可以将输出作为单字母参数 、 等访问%%a
。%%b
如果输出需要存储在“普通”变量中,则需要在命令中完成for ... do
,如下所示:
for /f "tokens=3" %%a in [...] do SET STEAMDIR=%%a