サーチ…


前書き

このトピックでは、バッチファイルで行うべきこと(必須ではない)に焦点を当てます。これらの「ベストプラクティス」を使用すると、バッチファイルの効果と機能を強化できます。

引用

ほとんどのオンラインバッチスクリプトには多くの引用符の問題があります。


例と解決策

例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つの通常の文字列として見ます。しかし、これは最も安全な比較方法ではありません。最も安全なものはechopipefindstrです。


例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

両方のスクリプトは全く同じ結果を出力しますが、新しいスクリプトははるかに短く、より明確です。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow