2009-06-11 5 views
2

はので、ここで、よくこれを説明する方法を知りませんでした値がコードCMDは/

@echo off 
set test=0 

for /f %%a in (textfile.txt) do (
rem loops five times(5 lines in textfile.txt) 

set /a test=test+1 
rem Adds 1 to Test 

echo %%a 
rem Echo's correct line in file 

echo %test% 
rem Echo's whatever X was before the loop 

) 

echo %test% 
rem Displays the correct value of X 

pause 

で保持していないこれは私が、txtfileで問題を発見していますどこのほんの一例です。 txtには5行があるので、forループは5回、testは+ 1になり、/ aはXの正しい値を表示しますが、forループの最後のエコーは0を表示します。ループの前に設定します。

ループが終了するまで、テストの値は変化していません...これを修正する方法はありますか?

もっと簡単な方法があるかもしれないので、ここで私が達成したいことがあります:findstrのすべてのrtfが一連のサブフォルダ内にあるforループを実行し、すべてを新しい名前ですべてのディレクトリにコピーします。 、1.rtf、2.rtf、3.rtfなどです。転送時に名前を変更する必要がある理由は、すべて同じ名前です。

答えて

2

遅延環境変数拡張を使用する必要があります。 CMD /?を参照してください。

/V:ON遅延環境を有効にする 可変拡張を使用してください!区切り文字は です。たとえば、/ V:ONは!var!を許可します。実行時に 変数varを展開します。 var構文は、入力時に 変数 を展開します。これは、FOR ループの内部ではまったく異なるものです。

...

遅延環境変数の展開 はデフォルトで有効になっていません。 /V:ONまたは/ V:OFFスイッチを使用して、 CMD.EXEを呼び出すと、遅延環境を有効または無効にすることができます。

:あなたは REGEDIT.EXEを使用して いずれか、またはレジストリで次の REG_DWORD値の両方を設定することで、すべての マシン 上CMD.EXEの呼び出しおよび/またはユーザーのログオンセッションのために無効に遅れ拡張を有効にするか、または することができます
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion 
0x1又は 0x0いずれか

及び/又は

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion 

。ユーザ は、マシン設定の よりも優先されます。コマンドライン が、 のレジストリ設定よりも優先されます。遅れた環境変数 拡張が有効になっている場合は

、その後、 感嘆符は 代替に、実行時環境 変数の値を使用することができます。

4

Luceroが正しい。

コード例:!の

@echo off 
setlocal enabledelayedexpansion 
echo. 
set numLines=0 
echo examining file '%~f0' 
echo. 
rem loop N times, once for each line in the file 
for /f %%a in (%~f0) do (

    rem add 1 to the numLines variable 
    set /a numLines=!numLines!+1 

    rem echo the first symbol from the line 
    echo line !numLines!: %%a 
) 

rem Display the number of lines in the file 
echo. 
echo The file '%~f0' has %numLines% lines. 
echo. 

pause 
echo. 
endlocal 
+0

forループ変数に '%% a'値を送信するのはどうですか?ちょうどそれを何時間も達成できない – xacinay

0

ちょうど遅延膨張を利用するための鍵は、VARを使用して変数を参照していることを追加したいです!構文対%var%。私はXPの遅延拡張では、デフォルトで有効になっていることを伝えることができます、あなたはvarを参照する必要があります!それは私のループを修正した。他のポスターに記載されているヘルプでこれを見つけました:

遅延環境変数の拡張を有効にしてください!区切り文字は です。 たとえば、/ V:ONは!var!実行時に 変数varを展開します。 var構文は、入力時に変数 を展開します。これは、FOR ループの内部ではまったく異なるものです。

私は見落としました!最初はビット。