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


96

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

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

@echo This should not execute

@echo Done.
goto :eof

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

何が悪いのですか?


回答:


146

コマンドライン引数が設定されているかどうかのチェックは可能ですが[%1]==[]Dave Costaが 指摘しているように、これ"%1"==""も機能します。

大なり記号と小なり記号をエスケープするために、使用法エコーの構文エラーも修正しました。さらに、それ以外の場合は引数exitが必要です。/BCMD.exe

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

18
[%1] == []は、%1自体に二重引用符が含まれる場合を正しく処理するため、 "%1" == ""よりも優れています。「%1 ==」は「現時点では予期しない」メッセージでエラーになります。
tekumara

2
あなたはコマンドライン引数が、使用していない場合は、なおset(私は正しいバッチ用語を知らない)変数は、あなたが使用することをお勧めします"%myvar%"==""場合のでmyvar、それにスペースを持っており、引用されていない、あなたはこの時点で」予期しないを取得します"メッセージ。
パット

1
@Pat SET変数はIF NOT DEFINED VarNameブロックでチェックできます。また、比較で引用符を使用しない場合はtukushanに+1します。しないでください。決して。
Fr0sT 2014年

10
"%~1"==""%1に二重引用符がある場合にも機能し、処理します
Drakkim

8
"%~1"==""変数のスペースは処理されますが、[]バージョンは処理されません。
Cookie Butter、

17

より高度な例:

⍟無制限の引数。

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インストーラーにする


14

括弧を取り除きます。

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

echo "%1"

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

if "%1"=="" echo match2

上記のスクリプトの実行による出力:

C:\>echo "" 
""

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

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

かっこを文字列の一部と見なして比較されていると思います。


1
if "%1"==""argにスペースがあるとクラッシュします。次に例を示しますrun.bat "a b"。@amrが使用する最良の答えを持っていますif "%~1"==""
wisbucky

6
IF "%~1"=="" GOTO :Usage

〜%1自体が引用符で囲まれている場合、%1の引用符を外します。

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


1
これが最良の答えです。他の回答は一部のケースでは機能しますが、次のようなより特殊なケースでは失敗しますrun.bat "a b"
wisbucky

@wisbuckyそれは受け入れられた答えを台無しにしいないようです。何が欠けていますか?
ruffin

@ruffin、例:run.bat ""でキャッチされません[%1]==[]
wisbucky 2017


2

これは他の回答と同じですが、ラベルを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

"%1" == ""が失敗した場合、これのすべてのバージョンは、特定の毒文字条件下で失敗します。定義されている場合、または定義されていない場合のみ安全です


if [not] defined ...のようなパラメータでは機能しません%1if "%~1" ...動作しない例がありますか?
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.