bat脚本for循环适用于CL,但双击时不起作用

时间:2013-05-06 21:49:10

标签: windows for-loop batch-file double-click

我有一个批处理文件,在批处理文件中,它查找特定目录并保存到变量,即第一个目录/文件的名称。这大致是我正在做的事情:

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

1 个答案:

答案 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!