我已经检查了批处理脚本的条件if语句语法的几个资源,尽管如此,我还是找不到我的错误。我通常会避免在这里提出这么简单的问题,但这是一个庞大项目的最后一项任务,所以我希望有人可以帮我看看我做错了什么。这是一个大学项目的脚本,仅用于探索概念。
@Echo OFF
REM Check time remaining
for /f "tokens=3 delims=: " %%a in (
'cscript //nologo "%systemroot%\system32\slmgr.vbs" /dli ^| find "Time remaining: "'
) do set "timeRemainingStatus=%%a"
Echo %timeRemainingStatus%
pause
REM Check SkipRearm dword value
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform"
set VALUE_NAME=SkipRearm
FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
Echo Value Name: %ValueName%
Echo Value Value: %ValueValue%
pause
IF %timeRemainingStatus% EQU 20160 (
Echo First level
pause
IF defined ValueName (
Echo Second Level
pause
IF %ValueValue% == "0x0" (
Echo Third Level
pause
regedit.exe /s "C:\Windows\SR.reg"
)
) ELSE (
Echo Fourth Level
pause
SLMGR /REARM
)
)
pause
我有回声和暂停,所以我可以看到运行的代码并验证变量是否保留其值。在第二次暂停后(在Echo Value Value:%ValueValue%命令之后)它崩溃了。我认为它的语法有问题,但我一直看不到任何错误,因为命令提示已关闭,尽管我已经暂停了。
答案 0 :(得分:0)
在for循环或if语句中设置变量时,您需要利用Setlocal EnableDelayedExpansion
。当引用在此上下文中设置的变量时,这也适用。使用EnableDelayedExpansion的任何变量都需要在变量周围添加感叹号而不是百分比(!Value!
而不是%Value%
)。您需要更改代码才能利用此功能。
答案 1 :(得分:0)
有一些问题。这是我采用的解决方案:
@Echo OFF
REM Check time remaining
for /f "tokens=3 delims=: " %%a in (
'cscript //nologo "%systemroot%\system32\slmgr.vbs" /dli ^| find "Time remaining: "'
) do set /a "timeRemainingStatus=%%a"
setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform"
set VALUE_NAME=SkipRearm
FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
set ValueName=%%A
set ValueType=%%B
set ValueValue=%%C
)
IF %timeRemainingStatus% EQU 0 (
IF defined ValueName (
IF "%ValueValue%" == "0x0" (
regedit.exe /s "C:\Windows\SR.reg"
)
IF "%ValueValue%" == "0x1" (
SLMGR /REARM
)
)
)
我需要添加/ a来设置(我以前认为我有,但我猜不是)。另外,我在将%ValueValue%与“0x0”进行比较时忘记了引号。虽然它可能不是最干净的做事方式,但我也将if-else更改为两个if语句。
我已经在虚拟机上启动时对其进行了测试,但它似乎运行正常。非常感谢给予的帮助。