/此时是出乎意料的

/此时是出乎意料的

仅在某些情况下使用下面的 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”似乎无法识别该选项,则问题可能不是由您引用的实际源代码引起的。问题可能是由运行代码的环境引起的。

相关内容