如何使用 SETX 在批处理代码中设置注册表变量?

如何使用 SETX 在批处理代码中设置注册表变量?

我正在尝试制作一个与 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

相关内容