次の検証ロジックをバッチファイルで使用しようとしていますが、バッチファイルにパラメーターが指定されていない場合でも、「usage」ブロックは実行されません。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
何が悪いのですか?
次の検証ロジックをバッチファイルで使用しようとしていますが、バッチファイルにパラメーターが指定されていない場合でも、「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
set
(私は正しいバッチ用語を知らない)変数は、あなたが使用することをお勧めします"%myvar%"==""
場合のでmyvar
、それにスペースを持っており、引用されていない、あなたはこの時点で」予期しないを取得します"メッセージ。
IF NOT DEFINED VarName
ブロックでチェックできます。また、比較で引用符を使用しない場合はtukushanに+1します。しないでください。決して。
"%~1"==""
%1に二重引用符がある場合にも機能し、処理します
"%~1"==""
変数のスペースは処理されますが、[]
バージョンは処理されません。
より高度な例:
⍟無制限の引数。
fileファイルシステム(
file
またはのいずれdirectory
か)またはジェネリックに存在しますstring
。isファイルかどうかを指定
⍟ディレクトリを指定
extensions 拡張機能はなく、レガシースクリプトで動作します!
⍟ 最小限のコード ☺
@エコーオフ :ループ :: --------------------------には引数がありますか? if ["%〜1"] == [""]( エコー完了。 後藤端 ) :: --------------------------引数は存在しますか? 存在しない場合%〜s1( エコーは存在しません ) そうしないと ( エコーが存在する 存在する場合%〜s1 \ NUL( エコーはディレクトリです ) そうしないと ( エコーはファイルです ) ) :: -------------------------- シフト 後藤ループ :終わり 一時停止
✨その他のもの..✨
中■ %~1
- ~
任意のラッピングを削除します"
か'
。
■in %~s1
-the s
はパスをにしますDOS 8.3 naming
。これは、物をチェックするときにfile-nameのスペースを回避するための素晴らしいトリックです(この方法では、リソースをさらに"
sでラップする必要がありません。
■ ["%~1"]==[""]
引数がファイル/ディレクトリまたは一般的な文字列である場合、「確信が持てない」ので、代わりに式は括弧と元の変更されていないものを使用します%1
("
ラッピングがある場合は、ラッピングなし)。
使用したかどうかの引数がなくshift
、arg-listポインターが最後の引数を渡した場合、式はに評価され[""]==[""]
ます。
■これは、より多くのトリックを使用しなくてもできるほど具体的です(Windows 95のバッチスクリプトでも機能します...)
名前を付けて保存 identifier.cmd
無制限の引数を識別できます(通常は%1
-に制限されます%9
)。引数を逆コンマで囲むか、8.3の名前を使用するか、ドラッグアンドドロップしてください(上記のいずれかを自動的に行います)。
これにより、次のコマンドを実行できます。
⓵ identifier.cmd c:\windows
取得する
存在する ディレクトリです できた
⓶ identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
取得する
存在する ファイルです できた
⓷と複数の引数(もちろんこれは全体の取引です。)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
そして得るために
存在する ディレクトリです 存在する ファイルです 存在する ファイルです 存在しない 完了しました。
当然、もっと複雑になる可能性があります が、優れた例は常にシンプルで最小限である必要があります。:)
ここに公開:CMD Ninja-無制限の引数処理、ファイルシステムに存在するかどうかの識別、ファイルまたはディレクトリかどうかの識別
APKの任意の量(Androidアプリ)を取得し、デバッグコンソール(ADB.exe)を介してデバイスにインストールする実際の例を次に示します 。前の投稿をADBインストールマルチ構文を使用しない大量APKインストーラーにする
括弧を取り除きます。
サンプルバッチファイル:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
上記のスクリプトの実行による出力:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
かっこを文字列の一部と見なして比較されていると思います。
if "%1"==""
argにスペースがあるとクラッシュします。次に例を示しますrun.bat "a b"
。@amrが使用する最良の答えを持っていますif "%~1"==""
IF "%~1"=="" GOTO :Usage
〜%1自体が引用符で囲まれている場合、%1の引用符を外します。
「」は、渡された特殊文字から保護されます。たとえば、&pingを使用してスクリプトを呼び出す
run.bat "a b"
run.bat ""
でキャッチされません[%1]==[]
。
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
run.bat "a b"
これは他の回答と同じですが、ラベルを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を使用します。これらの構文には、より適切な構文があり、難解な機能が少なくなっています。