バッチファイルで次の検証ロジックを使用しようとしていますが、バッチファイルにパラメーターが指定されていない場合でも、「usage」ブロックは実行されません。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
何が間違っていますか?
コマンドライン引数が設定されているかどうかのチェックは、[%1]==[]
、ただし、 Dave Costa指摘 、"%1"==""
も機能します。
また、使用法エコーの構文エラーを修正して、大なり記号と小なり記号をエスケープしました。さらに、exit
には/B
引数、それ以外の場合CMD.exe
は終了します。
@echo off
if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
より高度な例:
⍟引数は無制限。
fileファイルシステム(
file
またはdirectory
?)または汎用string
に存在します。fileファイルかどうかを指定します
⍟指定はディレクトリです
⍟no拡張機能、レガシースクリプトで動作します!
⍟最小コード☺
@ echo off :loop :: ----------------------- ---引数があるか? if ["%〜1"] == [""]( echo done。 goto end ) :: --------------------------引数が存在しますか? 存在しない場合%〜s1( echo not exist )else( echo exist if exist%〜s1\NUL( echo is a directory )else( echoはファイル ) ) :: ------------------------ - shift goto loop :end pause
✨その他のもの..✨
■_%~1
_で-_~
_は、ラッピングされている_"
_または_'
_を削除します。
■in _%~s1
_-s
はパスを_DOS 8.3 naming
_にします。これは、ファイル名のスペースを回避するための便利なトリックです(この方法ではリソースをラップする必要はありません)さらに_"
_ sを使用します。
■引数がファイル/ディレクトリまたは単なる汎用文字列の場合、_["%~1"]==[""]
_は「不明」であるため、代わりに式では角括弧と元の変更されていない_%1
_を使用します(_"
_ラッピング(ある場合)。)
shift
を使用したかどうかの引数がなく、arg-listポインターが最後のものを渡した場合、式は_[""]==[""]
_に評価されます。
■これは、より多くのトリックを使用せずに特定できることです(windows-95のバッチスクリプトでも機能します)。
_identifier.cmd
_として保存します
無制限の引数を識別できます(通常は_%1
_-_%9
_に制限されます)、引数を逆コンマでラップすることを忘れないでください、または8.3ネーミングを使用するか、それらをドラッグ&ドロップします(自動的に上記の)。
これにより、次のコマンドを実行できます。
⓵_identifier.cmd c:\windows
_および取得する
exist はディレクトリです 完了
⓶identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
および取得する
exist はファイルです 完了
⓷および複数の引数 (もちろん、これは完全な取引です。)
_identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
_
と取得する
exist はディレクトリ exist はファイル exist はファイル は存在しません done。
当然、もっと複雑になる可能性があります、しかし、素敵な例は常にシンプルで最小限でなければなりません。:)
ここに公開: CMD Ninja-無制限の引数処理、ファイルシステムに存在するかどうかの識別、ファイルまたはディレクトリの場合の識別
ここに、任意の量のAPKファイル(Androidアプリ)を取得し、debug-console(ADB.exe)を介してデバイスにインストールする実際の例を示します: Make APK Installer ADB Install-Multi構文を使用しない
括弧を取り除きます。
サンプルバッチファイル:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
上記のスクリプトの実行からの出力:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
私は実際に括弧を文字列の一部とみなしており、比較されていると思います。
IF "%~1"=="" GOTO :Usage
〜は、%1自体が引用されている場合、%1の引用符を解除します。
「」は、渡される特殊文字から保護します。たとえば、&pingを使用してスクリプトを呼び出す
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
"%1" == ""が失敗した場合、特定の有害なキャラクターの状態では、このバージョンはすべて失敗します。 IF DEFINEDまたはIF NOT DEFINEDのみが安全です
これは他の回答と同じですが、1つのラベルのみを使用し、使用法を最初に配置します。これにより、通常は最上部にも配置されるスクリプトの一種のドキュメントとしても機能します。
@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo param%%1 the file to operate on
echo param%%1 another file
:: --------------------------
exit /B 1
:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...
ただし、cmd/batchを使用する必要がなく、WSLまたはpowershellでbashを使用する必要がない場合は、より健全な構文とより難解な機能が使用されます。