最初のバッチ - 勇敢!...そしてブラボー!!
reg
まず、コマンドを実行してみましょう。奇妙なことに、要求されたキーが欠落している場合、non- にreg
設定されません。そのため、その部分だけが実行されていました。errorlevel
0
version 7
reg query
キーが見つからない場合、出力は生成されませんが、エラー メッセージが生成されます。エラー: 指定されたレジストリ キーまたは値が見つかりませんでした。The output string is sent to
通常はコンソールに割り当てられるstdout and is the output that would be processed by the
do part. The error string is sent to
stderr`。
だから - まず、何もnum
「設定」されないようにしましょう
set "num="
構文SET "var=value"
(値が空である場合があります) は、割り当てられた値に末尾の空白が含まれないようにするために使用されます。set /a
「引用符なし」で安全に使用できます。
SET
バッチは、ステートメント内のスペースに敏感です。SET FLAG = N
"FLAG" という名前の変数を " N"Spaceの値に設定するのは、このルールを無視する後の実装です。(ただの注意)Spaceset /a
次に、コードのくすぐったバージョンを使用できます
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer\Version7 /v ClientID 2^>nul') do (set /a num = %%a)
追加の2^>nul
リダイレクトstderr
先nul
(つまり、 nowhere )。キャレット^
は と呼ばれ、の一部ではない部分であるescape character
ため、ここで必要です。(したがって、「エスケープ」と呼ばれます)>
reg query
for
>
その結果、キーが存在する場合、set
が実行さnum
れ、値が割り当てられます。キーが欠落している場合は、num
変更されません。
num を何も初期化しなかったことを覚えていますか? そして、(キーが存在する場合)に設定した可能性があるので、変数が設定されているかどうかをテストできますnum
something
if defined num goto print
(バッチはほとんど大文字と小文字を区別しません)
というわけで、 の構文について少し説明しますif
。アクション部分では、文字列else
がコマンドのパラメーターなのかキーワードなのか、バッチはわかりませんELSE
。したがって、次のように伝える必要があります。
if somebinarycondition (
dothis_if_true
) else (
dothis_if_false
)
また
if somebinarycondition (dothis_if_true) else (dothis_if_false)
括弧の位置は重要です。最初のオープンはif
(またはdo ) と同じ物理行にある必要があり、else が使用されている場合は、前後の両方が)
と(
同じ物理行にelse
あるelse
必要があり、キーワードと括弧の間にはスペースが必要です。これにより、複数の行を条件付きで実行できます。else
節が欠落している場合、またはelse
実行する必要があるコマンドが 1 つだけの場合は節に括弧は必要ありません。
exit
バッチは、ファイルの終わりまたはステートメントが検出されるまで、命令を 1 行ずつ実行するだけです。
if condition (goto there) else (goto here)
:here
より簡単に書かれています
if condition goto there
:here
が false の:here
場合、ラベルに続く命令が実行されます。condition
したがって、全体として、
SET "num="
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer\Version7 /v ClientID 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
:EIGHT
for /f "tokens=3" %%a in ('reg query "HKLM\Software\Wow6432Node\TeamViewer\Version8 /v ClientID" 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
:NINE
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer /v ClientID 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
echo Not found!
pause
goto :eof
:Print
echo Teamviewer ID is %num%
多くの言語とは異なり、バッチには「手順」の終わりの概念がありません。ファイルの終わりに達するまで、行ごとに実行を続けるだけです。したがって、メインラインを完了した後に実行する必要がありgoto :eof
ます。そうしないと、サブルーチン コードを介して実行が続行されます。:EOF
は によって理解される定義済みのラベルCMD
ですend of file
。コロンが必要です。