批量

时间:2016-11-23 06:27:40

标签: batch-file if-statement syntax conditional

我已经检查了批处理脚本的条件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%命令之后)它崩溃了。我认为它的语法有问题,但我一直看不到任何错误,因为命令提示已关闭,尽管我已经暂停了。

2 个答案:

答案 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语句。

我已经在虚拟机上启动时对其进行了测试,但它似乎运行正常。非常感谢给予的帮助。

相关问题