私は引数を読むためにfor-loopを使用しません。 LinuxDiscipleに記載されているように、バッチをbashやcshとあまりにも速く比較しないでください。たとえば。配列やハッシュをバッチで作成したりアクセスしたりするのは簡単ではありません(興味がある場合は、答えの最後にリンクを追加して、どのようにできるかを説明します)。 forループを実際に使用したい場合は、おそらく状態変数の使用が最適です(Klitos Kyriacou's answer参照)。
私は、変数を割り当てるとき、それは(と変数名を予期しない結果を与える可能性があり、スペースで「=」囲まない、代わりにLinuxDiscipleもmentionned
@echo off
SetLocal EnableDelayedExpansion
:check_args
REM Check if arguments left
IF "%~1%" == "" goto :EndArgs
IF "%~1" == "abc" (
REM next argument is %2
set var=%~2
REM Don't forget extra shift because you already handled next argument too
shift
echo I just saw you gave "abc", I set var to !var!
) ELSE (
echo It's just a normal argument: "%~1"
)
shift
goto :check_args
:EndArgs
EndLocal
exit
としてバッチで、伝統的なラベルとgoto文を使用します末尾のスペース、見出しスペースの値、...)。上記のコードは、(スクリプトがargum.batと呼ばれている)ようなものになります。ここでは
>argum abc blabla def
I just saw you gave "abc", I set var to "blabla"
It's just a normal argument: def
>argum "just random things" abc "this is more serious"
It's just a normal argument: "just random things"
I just saw you gave "abc", I set var to "this is more serious"
delayed expansionへのリンクです。この場合、cmd-parserはIF-clauseとFOR-loopを1つのコマンドとして読み込みます(1行に書かれているかのように)。遅延拡張を使用しない限り、同じコマンドで変数を作成して読み込むことはできません。また、%var%
の代わりに!var!
を使用する理由も説明します。 は私も周囲の引用符( ")を削除するには%~1
の代わり%1
を使用あなたには、いくつかのより多くをしたい場合は、
オフコース引数とforループ変数を操作するために使用できる『トリック。このlinkは、いくつかの他のを持っています』あなたの議論を複雑なものにすることは、if-else節のサイズのために良い選択肢ではありません。私がこれを尋ねたときに使ったようなあなたの議論を扱うためには、別の方法を使わなければなりません。回答も同様)またはこのquestionの回答として提案されている方法(私の質問にも回答としてリンクされています)
幸運!
PSバッチ内のアレイソリューションへのpromissed、リンクとして:それはもう一つの方法は、内のすべての要素をリストアップすることで、通常の配列インデックス
を使用するように、「トリッキー」である理由this tutorialで
- あなたが表示されます文字列を区切り文字で区切ります(空白は大部分が使用されます)。区切り文字を区切り文字として(あなたの行ったように)反復するために
for /f
- loopを使います。ここでの問題は、反復中に他の配列要素にアクセスするために余分な変数を使用する必要があることです。
'/ fヘルプ 'と'遅延拡張'を確認してください – npocmaka
バッチ(シェルスクリプト)を使用しないでください。 PowerShellははるかに優れています。 –