batch-file
ベストプラクティス
サーチ…
前書き
このトピックでは、バッチファイルで行うべきこと(必須ではない)に焦点を当てます。これらの「ベストプラクティス」を使用すると、バッチファイルの効果と機能を強化できます。
引用
ほとんどのオンラインバッチスクリプトには多くの引用符の問題があります。
例と解決策
例A
if %var%==abc echo Test
このコードは、 %var%
内容にスペースやその他の特殊文字が含まれていない場合に機能します。さて、 %var%
に空白が1つあると仮定しましょう。今すぐcmd.exe
が表示されます:
if ==abc echo Test
これは、 cmd.exe
がこの構文を理解していないため、エラーが発生します。
解決策A
if "%var%"=="abc" echo Test
引用符を使用すると、 cmd.exe
は%var%
(スペースと特殊文字を含む)全体を1つの通常の文字列として見ます。しかし、これは最も安全な比較方法ではありません。最も安全なものはecho
、 pipe
、 findstr
です。
例B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
のみにディレクトリを変更しますC:\User\Spaced
としてcd
一つだけパス引数を受け入れます。
ソリューションB
パスの周りに引用符を付けるだけで、問題は解決されます。
cd "C:\User\Spaced Name\Spaced FileName.txt"
また、 set /a
ステートメントなどのように引用符を使ったほうが良い例もいくつかありますが、スペースや特殊文字を含む文字列を扱う場合は、通常は引用符を使用する方が安全です。
スパゲッティコード
スパゲッティコードとは、多くの、そしてしばしば混乱する構造を使用するコードスニペットを意味します。 GOTO
、例外と一貫性のないコード。
例と解決策
例A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
このプログラムには多くのジャンプがあり、スクリプトが正確に何をしているかを知ることが難しくなります。
解決策A
@echo off
for /l %%G in (0,1,10) echo %%G
GOTO
の使用量を減らしてコードの量を大幅に減らし、実際のコードに焦点を当てることができます。
例B
以下のステートメントを考えてみましょう。
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
このスニペットでは、多くのgoto
文が必要となり、デバッグが混乱する可能性があります。これらの文を単純化するために、 call
コマンドを使用できます。上記のスクリプトは、より良い状態にあります。
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
両方のスクリプトは全く同じ結果を出力しますが、新しいスクリプトははるかに短く、より明確です。