我正在使用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属性时,此处发布的代码开始正常工作(初始版本)。
答案 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