2016-08-02 6 views
0

25回ごとにタイムアウト/ t 3コマンドを実行するためにMOD(%%)を使用しようとしました "無効なオペランド"エラーが発生しました コードは次のとおりです。バッチ - FORループでモジュロを使用する - エラーオペランド

set /a var1=0 
FOR /R "folder" %%G in (.) DO (
Pushd %%G 
set /a b=%%var1%% %% 25 
IF %%b%% EQU 0 (
    timeout /t 3 
) 
set /a var1=%%var1%%+1 
Popd 
) 
+0

まあ、私は、無効なオペランドから抜け出すために管理が、私はモジュロ演算子が –

+0

あなたが仕事を得るように見えることはできませんだけで、 ''%VAR1%をする必要はありません。しかし、正しいポーズは以下で導入されました'%% var1 %%'。 – SomethingDark

+0

@SomethingDark、一般的にはあなたが正しいですが、ここでは遅延拡張が必要です(少なくとも '!b!'の場合)... – aschipfl

答えて

1

なぜあなたは%兆候のペアで変数名を囲んでいますか?変数を読み取るための通常の構文は%var1%です。

set /Aは、パーセント記号がなくても変数を読み取ることができるため、set /a b=var1 %% 25を使用してください。
他のset /Aコマンドラインはset /A var1+=1に変更できます。

あなたは同じコード(括弧の)ブロック内でそれを読んを書いているので、全体forループが解析されるとき%b%が読み込まれ、その時点でので、あなたのコード内の1つの問題の変数、すなわちbは、ありますそれはおそらく空です。
このような場合は、delayed expansionを適用する必要があります。そのため、実行時に変数が読み取られます。有効にするには、setlocalコマンドを使用します。それを実際に使用するには%b%の代わりに!b!と書いてください。ケースには、感嘆符が含まれているため、ここで

set /A var1=0 
for /R "folder" %%G in (.) do (
    pushd "%%~G" 
    set /A b=var1 %% 25 
    setlocal EnableDelayedExpansion 
    if !b! EQU 0 (
     timeout /T 3 
    ) 
    endlocal 
    set /A var1+=1 
    popd 
) 

遅延膨張forループ変数%%Gの膨張(読み出し)の間ディスエーブルされるように、私はループ内setlocalendlocalを配置:ここ

は、固定コードでありますそれ以外の場合は失われます。

2

aschipfl has identified the problem and provided a fix。しかし、単一のSET/Aステートメントのみを使用して遅延拡張を行わずに、目標を達成するための非常に簡潔で効率的な方法があります。

1つのSET/A内で複数の計算と割り当てを組み合わせることができます。より大きな式の中で代入式の結果を使うことさえできます。

意図的に0で割ってIF文を避けることができます。モジュロ結果が0の場合、除算は失敗し、stderrをnulにリダイレクトすることでエラーメッセージは表示されなくなります。条件付き||コマンド連結演算子は、直前のコマンドが失敗した場合(この場合は0で除算)にのみ起動します。

ループの目的を理解できません。無意味です。

set /a var1=0 
for /r "folder" %%G in (.) do (
    pushd "%%~G" 
    set /a "1/((var1+=1) %% 25)" 2>nul || timeout /t 3 
    popd 
) 
+0

卑劣なこと!私はいつも新しいことを学ぶので、あなたの答えが大好きです。 – DavidPostill

+0

ありがとう!魅力のように動作します。 –

+0

また、個人的な理由から、ループの外側とループの外側にいくつかのコードを削除しました。そのため、私のコードの目的がわかりません:) –

関連する問題