Windows 循环的bat脚本在CL上工作,但双击时不工作

Windows 循环的bat脚本在CL上工作,但双击时不工作,windows,for-loop,batch-file,double-click,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因

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

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

RaymondChen在评论中告诉我的话奏效了!我需要使用延迟扩展。原因是windows将for循环作为一条指令执行,因此在执行for循环之前,它会一次填充所有变量。因为我在for循环之前从未设置过名称,所以它的计算结果将为零。因此,NAME_DIR获取一个空字符串来代替%NAME%。我注意到,当我第一次在命令行上运行脚本时,它不起作用。我再次运行它,它成功了。我一直在运行它,每次都能正常工作。这是因为在运行for循环一次后,变量被保存并且从未更改。所以下次我运行代码时,变量不再是空的,它有正确的值。现在,当双击时,NAME变量在开始处为null。执行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\u DIR
是否从命令行获取正确的值?太棒了!请
echo
NAME
NAME\u DIR
中的值放在
goto:break
行之前,并将输出张贴在此处。我添加它是为了更清晰地显示
echo
命令放在代码的哪一行?对
%NAME%
的评估太早了。您需要使用延迟扩展。@endro我将echo命令直接放在for循环中,在创建之后和goto:break之前