当我使用start
批处理脚本中的命令启动程序时,我希望该程序能够异步启动;如果我启动的程序存在,这种情况就会如我所料那样发生。
但是,如果我尝试运行start
一个不存在的程序,Windows 会弹出一个窗口,告诉我找不到该文件,并锁定批处理脚本的执行,直到我手动关闭该窗口。这很烦人。由于某些远程文件系统的诡计,我无法可靠地保证二进制文件在运行之前存在,也无法锁定二进制文件。在我的场景中,如果二进制文件不存在,则不是严重错误,我的脚本应该继续运行。
有没有办法首先防止创建这些弹出窗口,或者可以使用批处理/cmd单行程序来异步执行应用程序,这样即使脚本失败也不会阻止其继续运行(我可以轻松地从 CLI 中使用批处理脚本)?
答案1
我无法可靠地保证二进制文件在运行之前存在
您可以使用来which.cmd
查看二进制是否存在,并返回适当的ERRORLEVEL
。
解决问题的方法(禁用“Windows 无法找到‘[foo].exe’”弹出窗口)
- 跑步
which program
- 检查
ERRORLEVEL
start
仅当program
找到时才运行。
:: WHICH.CMD 命令名称 [返回变量] :: :: 确定要执行的文件的完整路径,如果 :: CommandName 已执行。 :: :: 结果存储在变量 ReturnVar 中,否则 :: 如果未指定 ReturnVar,则回显到 stdout。 :: :: 如果未找到文件,则会向 stderr 回显错误消息。 :: :: ERRORLEVEL 设置为下列值之一 :: 0 - 成功:找到匹配的文件 :: 1 - 未找到文件且 CommandName 是内部命令 :: 2 - 未找到文件且 CommandName 不是内部命令 :: 3 - 语法不正确 - 未指定 CommandName
以下链接包含完整的源代码which.cmd
(由超级用户用户德本汉姆)。
来源哪个命令- 显示可执行文件的完整路径。
答案2
一种方法是将二进制文件复制/移动到具有唯一名称的新临时位置并执行它。
如果复制/移动成功,则唯一文件存在,您可以执行它而不会受到“远程文件系统恶作剧”的影响。如果没有,那么至少您知道您不会收到弹出窗口。
答案3
这可以防止阻止批处理脚本的执行,但遗憾的是不能阻止弹出窗口:
start cmd /c start foo
但它解决了阻塞批处理脚本执行的问题。
答案4
使用/C 开关作为启动命令,它应该会跳过烦人的弹出窗口。
启动/C appthatmayfail.exe 参数