【问题标题】:CMD trying to set variable in a loopCMD试图在循环中设置变量
【发布时间】:2017-01-18 13:12:50
【问题描述】:

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

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

我想在驱动器 F 上查找名称以“备份”开头的文件夹,并将该文件夹的名称保存到 %folder% 变量中。因此,例如,如果文件夹名为“backup 2017-01-18”,我希望将其保存到 var。

相反,它似乎没有设置任何内容,因为 ECHO 只是打印“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 %folder%,我会再次得知“ECHO 已开启”。

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

【问题讨论】:

  • 这组代码是否在另一个代码块中?你的第一组代码对我来说就很好。
  • 不,这是我手动运行的整个批处理文件。
  • 那么 F:\backup* 不存在。
  • 我发现了问题并编辑了我的帖子 - 这是因为 robocopy 在封闭文件夹上设置了隐藏、系统和只读标志 - 这阻止了我的 FOR 循环执行。
  • 如果您找到了问题的答案,请将其添加为答案并接受(我认为您必须等待 2 天才能接受)。

标签: batch-file for-loop cmd set


【解决方案1】:

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

要同时检测此类隐藏目录或系统目录,请将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多