我有一个批处理脚本,我本质上希望它向用户显示一个记事本窗口,其中打开了一个配置文件,供用户每次运行该脚本时进行编辑,并且我希望命令提示符等到该程序关闭后再继续执行,并运行使用该配置文件的程序。
我想这样做是因为我不想使用“set /P”命令样式在批处理脚本中获取用户输入,而且必须设置解析读取和写入具有许多需要检查的值的配置文件。
我认为,在 Windows 上执行任何可执行程序时的标准行为是,对于“exe”文件,它将在其自己的进程中打开该程序并立即将控制权交还给脚本/命令提示符。对于“bat”和“cmd”脚本文件,它将执行脚本并等待,直到控制权交还给第一个脚本或命令提示符。这应该是至少在使用“CALL”命令调用其他脚本或直接调用它时的行为。
现在在 Linux 上,我相信可执行内容的默认行为(既是没有扩展名的本机机器代码,也是“sh”文件之类的脚本)以阻塞方式执行,除非您在输入行的某处指定与符号(“&”)字符。
因此,我尝试在 Windows 上实现阻止行为,因为它在 Linux 上更容易实现,并且希望程序的关闭能够触发原始脚本继续,或者将控制权返回到命令提示符。
答案1
您可以使用start
命令(注意/B /WAIT
开关的顺序)
start "" /B /WAIT notepad.exe "somefile"
或者简单地
notepad.exe "somefile"
根据上面的链接:
运行 32 位图形用户界面 (
GUI
) 应用程序时,cmd
不会等待应用程序退出就返回命令提示符。如果您从命令脚本运行应用程序,则不会发生此行为。
编辑关于卡兰的评论:为什么需要/B?
/B
启动应用程序而不打开新的命令提示符窗口。
- 说实话:如果你经营一家图形用户界面应用程序然后不
/B
即使省略了开关,也会打开新的命令提示符窗口。 - 另一方面,如果你运行命令行工具,省略
/B
开关会导致在新的命令提示符窗口中运行该工具,将立即关闭结束后所有输出都丢失了。
因此,我将/B /WAIT
开关一起使用作为一般原则:无论启动程序的配置如何,都保持相同的行为,而不必考虑它......
补充按/B /WAIT
开关顺序包含来自 StackOverflow 的示例和更多链接:start /WAIT /B
不起作用(/wait
参数被忽略)而start /B /WAIT
起作用......
答案2
notepad.exe | echo > NUL
它的作用是打开 notepad.exe,并将其所有输出重定向到命令echo > NUL
。为了重定向整个输出,程序必须完成。因此,我们必须等到 notepad.exe 完成。输出转到 echo。Echo 不会以任何方式使用输入,只会将一些内容输出到 NUL。NUL 是一个标准的 Windows 流,无处可去。
答案3
在写这个问题的时候,我想到了一个答案,尽管它并没有达到我想要的确切结果。
它会打开我想要打开的任何程序,然后在下一行的后面直接添加“暂停”命令。它会暂停脚本执行,直到用户关闭刚刚出现的新程序窗口,并且需要意识到他们需要从该点手动推进脚本。暂停会打印出一个提示,解释正在发生的事情,以便潜在地通知用户(“ Press any key to continue . . .
”)。
除非出于某种原因将脚本最小化,并且用户认为它已完成,否则这不是一个大问题。这也不是很好,因为它不会在程序关闭时自动恢复运行脚本的其余部分,而这正是我想要的效果。
答案4
启动 Firefox 时,以下是我所做的操作:
start "" /B /WAIT "G:\Programs\Mozilla Firefox\firefox.exe" | pause