CMD试图在循环中设置变量

时间:2017-01-18 13:12:51

标签: batch-file for-loop cmd set

我正在使用Windows' cmd并尝试在循环中设置变量。这是我的代码:

for /d %%a in ("F:\backup*") do set folder=%%a
ECHO %folder%
PAUSE

我想查找名称以" backup"开头的文件夹在驱动器F上并将该文件夹的名称保存到%folder%变量。因此,例如,如果文件夹将被调用"备份2017-01-18"我喜欢保存到var。

相反,它似乎没有设置任何东西,因为ECHO只是打印出#34; ECHO在"。 for循环是正确的,文件夹也在那里(我已经在使用robocopy的其他批处理中使用了那段代码)。

理论上我可以将所有代码放在FOR循环中并使用%% a而不是%folder%var,但这似乎是一个hacky解决方案。

到目前为止,我发现的所有解决方案都指向使用EnableDelayedExpansion。我修改了代码使用它:

Setlocal EnableDelayedExpansion
for /d %%a in ("F:\backup*") do set folder=%%a
ECHO !folder!
PAUSE

但现在ECHO打印"!文件夹!"好像它不会检测到变量。如果我恢复到ECHO%文件夹%我再次了解" ECHO已开启"。

编辑: 我在这里找到了这个问题。我还在备份文件夹上运行另一个批处理文件。事实证明,ROBOCOPY(我在该批次中使用的)默认情况下将封闭文件夹设置为隐藏,系统和只读(即使复制的文件未被隐藏或系统为o_0)。当我删除目录上的HSR属性时,此处发布的代码开始正常工作(初始版本)。

1 个答案:

答案 0 :(得分:1)

如果您的循环for /d %%a in ("F:\backup*") do未检测到名称以backup开头的任何目录,则它们要么不存在,要么存在属性隐藏和/或系统设置。

要检测此类隐藏或系统目录,请将for /D循环替换为:

rem Change to parent directory "F:\" temporarily in order for the `~f` modifier to resolve the full path properly:
pushd "F:\" || exit /B 1
for /F "eol=| delims=" %%D in ('dir /B /A:D /O:N "backup*"') do set "folder=%%~fD"
popd