我有一个批处理文件,在批处理文件中,它查找特定目录并保存到变量,即第一个目录/文件的名称。这大致是我正在做的事情:
FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
set NAME=%%~xnF
set NAME_DIR=%INSTALL_DIR%\dir\%NAME%
goto :break
)
当我从命令行运行它时,它运行正常,NAME_DIR获取正确的值。但是,当我双击该文件时,NAME变量为空。因此,NANE_DIR设置为%INSTALL_DIR%\ dir。为什么会发生这种情况,我该怎么做才能解决它?
有关更多说明,请从命令行,这是回显时NAME和NAME_DIR相等的内容:
NAME: dir1.3.8
NAME_DIR: D:\root\path\to\dir\dir1.3.8
这是双击时回显的内容:
NAME:
NAME_DIR: D:\root\path\to\dir
答案 0 :(得分:2)
RaymondChen在评论中告诉我的是什么!我需要使用延迟扩展。这样做的原因是windows将for循环作为单个指令执行,因此它在执行for循环之前立即填充所有变量。由于我从未在for循环之前设置NAME,因此它只会评估为空。因此,NAME_DIR获取一个空字符串来代替%NAME%。我注意到,当我第一次在命令行上运行脚本时,它不起作用。我再次运行它,它工作。我一直在运行它,每次都有效。这是因为在运行for循环一次之后,变量被保存并且永远不会改变。因此,下次运行代码时,变量不再是空白,它具有正确的值。现在双击时,NAME变量在开头为空。执行for循环后,将更新NAME的值。一旦脚本执行并且cmd窗口退出,变量的新值将丢失并重新开始。这是延迟扩展的新代码:
setlocal ENABLEDELAYEDEXPANSION
FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
set NAME=%%~xnF
set NAME_DIR=%INSTALL_DIR%\dir\!NAME!
goto :break
)
我在setlocal语句中添加了%NAME%
更改为!NAME!