2

これをうまく説明する方法がわからなかったので、ここにコードがあります

@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 が表示されます。これは、ループの前に test が設定されている値です。

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

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

4

3 に答える 3

4

ルセロは正しい。

コード例:

@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
于 2009-06-11T13:19:21.727 に答える
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

および/または

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

またはのいずれ0x1かに0x0。ユーザー固有の設定は、マシンの設定よりも優先されます。コマンド ライン スイッチは、レジストリ設定よりも優先されます。

遅延環境変数展開が有効になっている場合は、実行時に感嘆符を使用して環境変数の値を置き換えることができます。

于 2009-06-11T12:21:39.867 に答える
0

遅延展開を利用するための鍵は、!var! を使用して変数を参照することです。構文対 %var%。XP では、デフォルトで遅延拡張が有効になっていることがわかります。! を使用して変数を参照するだけです。それは私のループを修正しました。他のポスターが言及したヘルプでこれを見つけました:

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

見落としていました!! 最初は少し。

于 2010-04-15T20:51:36.830 に答える