web-dev-qa-db-ja.com

バッチファイルの開始/呼び出し時に引数が定義されているかどうかを確認するにはどうすればよいですか?

バッチファイルで次の検証ロジックを使用しようとしていますが、バッチファイルにパラメーターが指定されていない場合でも、「usage」ブロックは実行されません。

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

何が間違っていますか?

90
Daniel Fortunov

コマンドライン引数が設定されているかどうかのチェックは、[%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
136
Iain

より高度な例:

⍟引数は無制限。

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構文を使用しない

16
user257319

括弧を取り除きます。

サンプルバッチファイル:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

上記のスクリプトの実行からの出力:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

私は実際に括弧を文字列の一部とみなしており、比較されていると思います。

14
Dave Costa
IF "%~1"=="" GOTO :Usage

〜は、%1自体が引用されている場合、%1の引用符を解除します。

「」は、渡される特殊文字から保護します。たとえば、&pingを使用してスクリプトを呼び出す

6
Amr Ali
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
2

"%1" == ""が失敗した場合、特定の有害なキャラクターの状態では、このバージョンはすべて失敗します。 IF DEFINEDまたはIF NOT DEFINEDのみが安全です

0
codey

これは他の回答と同じですが、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を使用する必要がない場合は、より健全な構文とより難解な機能が使用されます。

0
masterxilo