【问题标题】:Variable not Echoing in For Loop变量在 For 循环中不回显
【发布时间】:2018-05-13 02:54:29
【问题描述】:

我正在尝试使用文件夹中的批处理文件获取文件名,但它不起作用。

我遵循了 here 的指导方针,但由于某种原因,它根本没有返回任何东西!

FOR /F "tokens=*" %%G IN ('dir /b C:\Users\Desktop\UPD\*.txt') DO SET result=%%G

我也试过了:

FOR /F "tokens=*" %%G IN (dir /b C:\Users\Desktop\UPD\*.txt') DO SET _result=%%~G

echo %_result% >> %~dp0Outputfile.txt

我得到的是:

ECHO is on.

编辑

这是我目前所做的:

IF EXIST C:\Users\Nathanael\Desktop\UPD\*.txt (
    echo file found >> %~dp0Outputfile.txt
    chDIR C:\Users\Nathanael\Desktop\UPD\
    dir *.txt /b >> %~dp0Outputfile.txt

    FOR /F "tokens=*" %%G IN ('dir /b C:\Users\Nathanael\Desktop\UPD\*.txt') DO SET result=%%G
    echo %result% >> %~dp0Outputfile.txt
)

输出是:

file found
NewVHD.txt
random.txt
ECHO is on.

【问题讨论】:

  • “结果”已经作为元变量输出,%G,因此如果您在循环中使用该元变量而不是首先将其设置为局部变量和使用它,For /F %%G IN ("C:\Users\Nathanael\Desktop\UPD\*.txt") Do (Echo %%G)>>"%~dp0OutputFile"。但你不只是回显到一个文件,是吗?因为您已经知道,Dir /B "C:\Users\Nathanael\Desktop\UPD\*.txt">"%~dp0OutputFile" 可以做到这一点。如果您向我们展示您打算使用 %result% 做什么会更好,以便可以相应地定制解决方案。

标签: batch-file variables for-loop echo


【解决方案1】:
  • 如果for /f 返回多个文件,最后一个将覆盖set 中的前一个
  • cmd.exe 解析(代码块)的方式需要延迟扩展,当 var 设置并在与 if exist 相同的代码块内使用时

所以要么避免使用反向逻辑的代码块

IF NOT EXIST "C:\Users\Nathanael\Desktop\UPD\*.txt" Goto :Eof or other label

或者(总是缩进代码块以便更好地跟踪):

Setlocal EnableDelayedExpansion
IF EXIST "C:\Users\Nathanael\Desktop\UPD\*.txt" (
    echo file found >> %~dp0Outputfile.txt
    chDIR "C:\Users\Nathanael\Desktop\UPD\"
    dir "*.txt" /b >> %~dp0Outputfile.txt
    FOR /F "tokens=*" %%G IN ('dir /b C:\Users\Nathanael\Desktop\UPD\*.txt') DO SET result=%%G
echo(!result! >> %~dp0Outputfile.txt
)
  • 始终将路径用双引号括起来是一个好习惯
  • 为了避免echo is off 消息在 var 可能为空时使用除空格之外的其他命令分隔符(我在这里使用了 (

【讨论】:

  • 非常感谢您的解释,效果很好!
【解决方案2】:
FOR /F "tokens=*" %%G IN ('dir /b C:\Users\Desktop\UPD*.txt') DO SET result=%%G

确保路径正确(例如,可能应该是c:\Users\YourName\Desktop\UPD*.txt,其中YourName 是用户名)?

【讨论】:

  • 感谢您的回复,我在发布后注意到了所有这些:S。做了改变,结果还是一样
  • 我看到了你对 _result 的修复,所以我删除了我的答案的那部分。尝试从命令行运行dir 命令以确保它返回预期值。
  • IF EXIST C:\Users\Nathanael\Desktop\UPD*.txt ( 找到回显文件 >> %~dp0Outputfile.txt chDIR C:\Users\Nathanael\Desktop\UPD\ dir .txt /b >> %~dp0Outputfile.txt FOR /F "tokens=" %%G IN ('dir /b C:\Users\Nathanael\Desktop\UPD*.txt') DO SET result= %%G echo %result% >> %~dp0Outputfile.txt ) 输出: CheckVHD started nathan file found NewVHD.txt random.txt
猜你喜欢
  • 2018-03-23
  • 1970-01-01
  • 2015-03-22
  • 2017-07-07
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多