批量递归地启动特定的.exe

2022-10-14 08:52:05标签windowsfor-loopbatch-filecmd
提问

在windows中,我有一个批处理文件,它与当前目录中的文件夹相同。 我试着递归地启动一个特定的。exe文件,在上面提到的文件夹深处有几个文件夹。 我在试: 但那是想要发射龙。exe然后QUEST。然后是XI。exe,我不明白为什么。 我认为这将与报价有关,但试过在我能看到和没有运气的地方增加/删除它们。 将通配符添加到(“% NAME % *”)工作,但如果有不止一个,可能会麻烦。exe从龙开始。 你所遇到的是由一些我认为是for / R循环的可怕的设计缺陷的,以及它的元变量和~ -修饰符的扩展。 创建以下批处理文件并执行: 如果在批处理文件的目录中有两个文件foo bar和foo条,那么输出将是这样的: 在一个具有绝对根路径的迭代项之前,似乎已经应用到的~ -修饰符(删除了潜在的引号)。一个循环的标准并不在任何情况之前,因此问题不能出现,而~ -修饰符可能会看到引用的字符串(删除/ R % ~ dp0。“从批处理文件从其父目录运行它,并在输出中检查引号”。 这条线体现了我们的情况是“~”,并引用了:\ test dir \“foo bar”;由于它的错误引用,命令解析器无意中识别了两个不同的令牌“D:\ test dir \“foo和bar”在“% ~ I”的扩展值中。 要返回您的代码,有以下选项可以解决for / R的坏行为: 添加通配符(最好使用?因为它只匹配一个字符,因此减少了匹配不需要的项的机会,然后重新检查遍历项目的名称: 让dir / S返回匹配文件(S),并使用for / F处理其输出:

set "NAME=DRAGON QUEST XI S.exe"
for /R "%~n0\" %%I in ("%NAME%") do if exist "%%I" start "" /WAIT "%%I"

回答

@for /R "%~dp0." %%I in (foo bar "foo bar" "foo bar?") do @(
    echo/
    echo Modifier '~nx': %%~nxI
    echo No modifiers  : %%I
    echo Modifier '~'  : %%~I
    echo Modifier '~f' : %%~fI
    echo '~' and quoted: "%%~I"
)

Modifier '~nx': foo
No modifiers  : D:\test dir\foo
Modifier '~'  : D:\test dir\foo
Modifier '~f' : D:\test dir\foo
'~' and quoted: "D:\test dir\foo"
Modifier '~nx': bar
No modifiers  : D:\test dir\bar
Modifier '~'  : D:\test dir\bar
Modifier '~f' : D:\test dir\bar
'~' and quoted: "D:\test dir\bar"
Modifier '~nx': "foo bar"
No modifiers  : D:\test dir\"foo bar"
Modifier '~'  : D:\test dir\"foo bar"
Modifier '~f' : D:\test dir\"foo bar"
'~' and quoted: "D:\test dir\"foo bar""
Modifier '~nx': foo bar
No modifiers  : D:\test dir\foo bar
Modifier '~'  : D:\test dir\foo bar
Modifier '~f' : D:\test dir\foo bar
'~' and quoted: "D:\test dir\foo bar"
Modifier '~nx': foo barS
No modifiers  : D:\test dir\foo barS
Modifier '~'  : D:\test dir\foo barS
Modifier '~f' : D:\test dir\foo barS
'~' and quoted: "D:\test dir\foo barS"

set "NAME=DRAGON QUEST XI S.exe"
for /R "%~n0" %%I in ("%NAME%?") do (
    if /I "%%~nxI"=="%NAME%" (
        if exist "%%I" (
            ECHO start "" /WAIT "%%I"
        )
    )
)

set "NAME=DRAGON QUEST XI S.exe"
for /F "delims=" %%I in ('dir /S /B /A:-D-H-S "%~n0\%NAME%"') do (
    if exist "%%I" (
        ECHO start "" /WAIT "%%I"
    )
)

▼版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说cuoshuo.com——程序员的报错记录

部分内容根据CC版权协议转载,如果您希望取消转载请发送邮件到cuoshuo8@163.com

辽ICP备19011660号-5