2016-11-23 20 views
0

バッチスクリプトのif文の条件文でいくつかのリソースをチェックしましたが、これにも間違いはありません。私は通常ここで質問するのは避けてください。これは単純なものでなければなりませんが、巨大なプロジェクトの最後のタスクなので、誰かが私が間違っていることを見るのを助けてくれることを願っています。これは大学のプロジェクトのためのスクリプトであり、単なる概念の探求のためのものです。条件付き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 

私はエコーとポーズがあるので、コードが実行されていることがわかり、変数が値を保持していることを確認できます。 2回目の一時停止後(Echo Value Value:%ValueValue%コマンドの後)にクラッシュします。私はそれが文法に何か間違っていると仮定しますが、私はすべての一時停止にもかかわらず、コマンドプロンプトが閉じるので、エラーを見ることができませんでした。

+0

次のように変更してみましたか? 'IF" x%timeRemainingStatus% "==" x20160 "' – geisterfurz007

+0

応答をありがとう。 xは何をするのですか?あなたの提案の残りの部分を正しく理解していれば、整数比較の代わりに文字列比較をすることをお勧めしますか?将来、このスクリプトは0以下の値をチェックしなければならない可能性があります。文字列比較でどうすればよいか分かりません。 –

+0

xには安全な文字があります。文字列の比較を行うときは、いつも自分のやり方をすることを勧めます。そこに '?'があると、スクリプトがクラッシュする可能性があります。整数比較が必要な場合は、if文の 'set/a timeRemainingStatus =%timeRemainingStatus%'の前にこれを行うことをお勧めします。エラーメッセージが表示されない場合は、Shiftキーを押しながらバッチファイルのディレクトリで右クリックし、[ここでコマンドウィンドウを開く]をクリックして、ファイル名を入力します。ウィンドウが閉じない。 – geisterfurz007

答えて

0

forループまたはif文内で変数を設定する場合は、Setlocal EnableDelayedExpansionを利用する必要があります。これは、このコンテキストで設定された変数を参照する場合にも当てはまります。 EnableDelayedExpansionを使用する変数は、パーセンテージ(%Value%の代わりに!Value!)ではなく変数の周りに感嘆符を付ける必要があります。これを利用するには、コードを変更する必要があります。

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 
     ) 
    ) 
) 

私は(私が前に持っていたと思ったが、私はそう思わない)を追加する必要があった。さらに、%ValueValue%と "0x0"を比較すると引用符を忘れてしまいます。物事を行う最もクリーンな方法ではないかもしれませんが、if-elseをif文に変更しました。

私はこれをVM起動時にテストしましたが、正常に動作しているようです。与えられた助けに非常に感謝します。