仅在某些情况下使用下面的 for 循环时,我得到了“/此时是意外的。”。
for /f "tokens=1,* delims=;" %%m in (file.txt) do (
echo Inside Loop
echo %%m
)
我循环从另一个批处理文件调用此批处理文件。因此每次都会更改 file.txt 的内容。
文件内容有问题吗?
这是完整的脚本:
echo off
SET FileName=%2
SET NUM=%3
:label
echo.
echo Parsing file.txt file
for /f "tokens=1,* delims=;" %%m in (file.txt) do (
echo Inside Loop
SetLocal EnableDelayedExpansion
echo %%n
SET str=%%m
SET "Number=!str::="^&REM #!
IF "!NUM!"=="" SET NUM="!number!"
if !number! GEQ !NUM! (
if /I not "!str:(ind)=!"=="!str!" (
echo It contains IND
) else >>"!FileName!" echo %1;!str!
echo %%n>Label_Name.txt
goto label
)
endlocal
)
:end
答案1
如果没有任何关于您的文件内容或执行此批处理的参数的迹象,那么这纯粹是猜测,但我怀疑这一行:
IF "!NUM!"=="" SET NUM="!number!"
它将设置NUM
为一个引用值。
可能更好的代码是
if not defined num set "num=!number!"
GOTO label
但同时 - 您在 中使用 ,SETLOCAL enabledelayedexpansion
而 AFAIAA 不会终止LOCAL
环境,因此之后的所有处理都将与 和SETLOCAL
一起delayedexpansion
生效。可以多次重新执行SETLOCAL Enable...
,构建越来越深的本地环境.... 在我看来这是最好的解决办法。
答案2
尝试这个:
@echo off&setlocal
for /f "tokens=1,* delims=;" %%m in (file.txt) do (
set "line=%%m"
echo Inside Loop
setlocal enabledelayedexpansion
echo !line!
endlocal
)
答案3
仅适用于某些情况
了解这些案件的具体情况可能会有所帮助。如果没有进一步的细节,这个问题(以目前的形式)的答案很容易让人产生猜测。
例如,这里有一个:
如果您键入 FOR /?,您会发现 /F 在以下部分中有描述:
如果启用了命令扩展,则支持以下附加的 FOR 命令形式:
根据CMD 文档,运行 CMD /E:ON 将启用命令行扩展。然后,第三方文档注意,运行 CMD /Y 可用于从 CMD 内部禁用命令扩展(并且可以使用 CMD /X 重新启用)。
因此,如果您发现在某些情况下运行批处理文件有效,但在其他情况下“FOR /F”似乎无法识别该选项,则问题可能不是由您引用的实际源代码引起的。问题可能是由运行代码的环境引起的。