1

以下のスクリプトを書きました。

@echo off
setlocal EnableDelayedExpansion

REM Collect source filenames from C:\Files and load into C:\doc.txt
dir C:\sources\Sourcefiles /b /a-d > C:\sourcefilenames.txt

REM fetch count of source files and store into variable count
For /F  %%I in ('call C:\count.bat ') Do Set count=%%I

REM loop "count" number of times and echo temp.txt value
FOR /L %%A IN (1,1,%count%) DO (

REM call line.bat to fetch line 1,line 2 and so on of sourcefilenames.txt    for each loop
call line.bat %%A>C:\temp.txt

set /p var=<C:\temp.txt
echo var:%var%    ----------> returns previous run value
type C:\temp.txt  ----------. returns current value of temp.txt

)

基本的に、上記のスクリプトから実行しようとしているのは、複数のループで使用するために、temp.txt の内容から変数 (var) を作成しています (temp.txt のデータは、ループが実行されるたびに変更されます)。

しかし、私が直面している問題は次のとおりです。 Echo var is:%var% command は、temp.txt の現在のコンテンツではなく、以前の実行値を返します。一方、コマンド「type C:\temp.txt」は、temp.txt の現在のコンテンツを返します。(注:他のスクリプトから変数「var」を呼び出し/作成した場合、以前の値が返されます。それ以外の場合はNullが返されます)

上記の問題に関するヘルプ/ガイダンスは本当に感謝しています。ありがとう

4

2 に答える 2

0

変数は再読み込みされずにメモリに残っていると思います。変数の有効性を制限しようとします。setlocal echo something..... endlocal または @echo off & setlocal

于 2016-06-25T17:07:23.250 に答える
0

When CMD.exe encounters a block of code in parentheses, it reads and parses the entire block before executing. This can cause unintuitive behavior. In this case, your echo var:%var% line is being parsed once at the beginning of the loop and never again.

The easiest fix for this is to change that line to

echo var:!var!

The !var! syntax is parsed every time through the loop. This works because you have enabledelayedexpansion set in your script.

Another workaround to this type of problem is to remove the parentheses and instead call out to a subroutine.

FOR /L %%A IN (1,1,%count%) DO call :loopLineBat %%A
... rest of script
exit /b

:loopLineBat
 >%temp%\temp.txt call line.bat %1

<%temp%\temp.txt set /p var=
echo var:%var%
type %temp%\temp.txt
exit /b

This loop does the same as above, but because it is not in a parenthesized block, all of the lines are parsed and executed in order.

于 2016-06-25T17:50:06.250 に答える