2016-09-22 10 views
1

ファイルに変数を設定し、一連の行を印刷するためのループを実行する方法がわかりません。変数で2番目のバッチを呼び出す際に問題が発生しました

ここ

はコードです:

バッチ1:

@echo off 
cls 

:: This batch is supposed to get the variable %string% and look in a different file (old.txt) and copy a block of 10 lines below the matching string. 

setlocal enabledelayedexpansion 
set string=%string% 
for /f "tokens=*" %%1 in (OLD.txt) do ( 
     if !flag! equ 1 (
     echo !string! %%1 >> output.txt 
     set /a count+=1 
     if !count! gtr 10 goto endit 
     ) 
    if /i "%%1" equ "!string!" (set flag=1) 
) 
echo "%string%" not found check spellings and input file. 
exit /b 

:endit 
type output.txt 

意図した結果は以下となります。

@echo off 

:: This batch read a file and copy all lines containing that word into a new 
file in an ordered list. (This works just fine) 

findstr /C:"wordA" OLD.txt >> list_of_variables.txt 
for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string% 

結果は、この

wordA 1111 wordb 
wordA 1112 wordb 
wordA 1113 wordb 
wordA 555 wordb 

バッチ2のようなものですのようなものになる:ここでは

|-same as string| | read form old.txt| 
wordA 1111 wordb wordc word worde worf 
wordA 1111 wordb wordg worh wordi worj 

は契約です:

私はそれらを使用する場合は、別途、それらの両方が正常に動作しますが、私は彼らが一緒に動作させるためにしようとすると、それは動作しません。 wordaのバッチ2はset string=wordaと同じように動作しますので、正しいですが、バッチ1の変数を渡すと、output.txtファイルに何も印刷されません。

他の解決策は、同じバッチファイル内の2つのループを呼び出すことですが、私はそれを理解することができませんでした。

ご迷惑をおかけして申し訳ございません。

ジョナサン。あなたの最初のバッチファイルで

+1

別の[遅延拡張](http://stackoverflow.com/a/30284028/2152082)の問題。 – Stephan

+0

なぜ2番目のバッチファイルで引数を指定し、2番目のバッチファイルでその引数を使用しないのですか? – Squashman

+0

Squashman、それは私がそれを働かせるために多くの変更を加えたので、私は多くのものを捨てたかもしれないからです。そのため、これを修正する方法のアイデアを得るために、両方のバットファイルを貼り付けました。 –

答えて

0

batch1では、

for /f "delims=" %%x in (list_of_variables.txt) do call dp2.bat %%x 

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string% 

を変更します。 delayedexpansionは、変数の値が変化するループ内の変数の実行時の値にアクセスすることができます。 %var%は、第二のバッチで

「がコマンドの操作によって変化としてvarの値」と!var!「ラインが発生したvarの元の値が」、各%%1%%qには変更手段(又は%% 任意の文字、場合と一致しています。%1the value of the first parameter provided to the routineを意味し、はメタバリアブルとして使用しようとすると災害になりやすく、バッチワールドでは悪い習慣とみなされます。

あなたはその後、渡された文字列がスペースやその他の区切りが含まれている場合、その後、あなたが引用する必要があることを

set "string=%1" 

注意を使用して(batch1で)設けられた第一のパラメータの値にstringの値を設定することができますそれはstringは、最初のバッチで環境に設定されるだろうと第二のバッチはを見ること、スタンドとしてパラメータが"%%x"に合格し、割り当てset "string=%~1"上の文字列をdequoteされているあなたと、コードを

~に注意してください)しかし、はバッチ1で設定されていたため、 set string=%string%は冗長です。

あなたの問題は、%%1をメタ変数として使用しようとしていると思います。

+0

FOR変数の前後に引用符を付ける必要があります。 'call dp2.bat" %% x "'。 – Squashman

+0

Magooさん、ありがとう、2回目のバッチはファイルの最初の10行を何度もコピーします。文字列を検索せずに10行をコピーします。 –

+0

'for'ループの前に変数' flag'を初期化する必要があります。 batch2が実行される前に環境変数が1に設定されていると、最初に値1が設定され、最初の10行が吐き出されます。変数 'count 'を初期化することも考えられます。定義されていない場合、 'set/a'はゼロの値をとります。個人的には、 'flag'のようなon/offアクションが使用されているので、* nothing *(' set "flag =" ')または* something *(* nothing *以外のもの)に設定します。 flag ... 'または' not defined flags ... 'を使用してその状態を解釈します。 – Magoo

0

、ライン:

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat %string% 

を実行する前に、全体として解析されます。その時点ではまだ%string%は空です。 あなたはdelayed expansionを使用しています不思議な、あなたは番目のバッチでdelayedexpansionを使用してではなく、最初にされ

for /f "delims=" %%x in (list_of_variables.txt) do set string=%%x & call dp2.bat !string! 
+0

ステファンありがとう、私は変更を加えたが、まだ動作しません。ループのバッチ2は何らかの理由で蹴られません。 –

+0

bat1はbat2にパラメータを与えます。 '%1'(=最初のパラメータ)でbat2で参照できます。 Btw。 'for '変数(' %% 1')として数字を使用しないでください。 '%1'は"最初のパラメータ "を意味するので、動作しますが混乱します。 – Stephan

+0

ステファンありがとう、私は変更を加え、代わりに文字を使用しました。 –

関連する問題