gpt4 book ai didi

batch-file - Windows CMD 批处理 : FOR/R with DelayedExpansion

转载 作者:行者123 更新时间:2023-12-03 23:35:16 25 4
gpt4 key购买 nike

在我的桌面上,有一个名为 的文件夹。 《测试》 .这个文件夹里面有两个文件, "file1.txt" "file2.txt" .

看看这个简单的批处理脚本:

@ECHO OFF

SET test="C:\Users\Tyler\Desktop\test"

ECHO %test%
FOR /R %test% %%F IN (*) DO (
ECHO %%F
)

如您所料,它输出以下内容:
"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt

现在看看这个变化:
@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET test="C:\Users\Tyler\Desktop\test"

ECHO !test!
FOR /R !test! %%F IN (*) DO (
ECHO %%F
)

ENDLOCAL

我希望它的输出没有什么不同。但是,这里是:
"C:\Users\Tyler\Desktop\test"

看来 !test!ECHO !test! 中得到扩展行,但不在 FOR /R !test! 中行,变成了 !test! .因为那当然不是有效路径,所以 FOR/R 循环永远不会迭代。

为什么是这样?我错过了什么?

最佳答案

为什么 FOR 的工作方式与 ECHO 不同是因为批处理解析器 (cmd.exe) 具有特殊的 parsing rules对于 FOR , IFREM .

因此延迟扩展不适用于此处的参数,仅适用于括号内的参数。

只有百分比扩展对参数有效,因为解析器在切换到特殊 FOR 之前执行百分比扩展阶段。解析器规则。

如果你不能使用百分比扩展,因为你在一个 block 内,你可以将代码移动到一个自己的函数并调用它。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:\Users\Tyler\Desktop\test"

ECHO !test!
call :doMyLoop test
exit /b

:doMyLoop
set "arg=!%1!"
FOR /R %arg% %%F IN (*) DO (
ECHO %%F
)

关于batch-file - Windows CMD 批处理 : FOR/R with DelayedExpansion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com