CALL命令与使用/ WAIT选项启动


149

带WAIT选项的START命令如何

START /wait notepad.exe 
START /wait  notepad.exe 

...与使用CALL命令有什么不同?

CALL notepad.exe 
CALL notepad.exe 

是否存在一种情况,一个人的行为可能会与另一个人的执行情况有所不同?


Answers:


183

对于exe文件,我认为差异几乎不重要。
但是启动一个exe文件甚至不需要CALL

当启动另一个批处理时,差异很大,
因为CALL它将在同一窗口中启动,并且被调用的批处理可以访问相同的变量上下文。
因此,它也可以更改影响调用方的变量。

START将为调用的批处理创建一个新的cmd.exe,如果没有/ b,它将打开一个新窗口。
由于它是一个新的上下文,因此无法共享变量。

差异性

使用start /wait <prog>
- <prog>结束时丢失环境变量的更改
-调用者等待直到<prog>完成

使用call <prog>
-对于exe,可以忽略它,因为它等同于启动<prog>
-对于exe-prog,调用者批处理以异步方式等待或启动exe,但是行为取决于exe本身。
-对于批处理文件,调用方批处理将继续,当被调用方<batch-file>完成后,如果没有调用,控件将不会返回到调用方批处理

附录:

使用CALL可以更改参数(对于批处理文件和exe文件),但仅当它们包含脱字符或百分号时才可以更改。

call myProg param1 param^^2 "param^3" %%path%%

将扩展为(从批处理文件中)

myProg param1 param2 param^^3 <content of path>

25
使用START / WAIT执行file.bat时,您需要指定START / WAIT cmd / c“ file.bat”,而不仅仅是START / WAIT“ file.bat”,否则为file.bat创建的cmd窗口将保持打开状态
FrinkTheBrave 2015年

5
您可以在以下位置找到CALL和START之间的比较: ss64.com/nt/start.html (今天更新为“ Start / Wait”和“ START vs CALL”部分)
Alfredo Capobianchi

我最喜欢的是start /wait /b cmd /c <batchfile.bat>因为批处理文件在同一命令窗口中一个接一个地运行
linux64kb '19

@ linux64kb,但是对于批处理文件来说则没有必要,您只需要call batchfile.bat
jeb

@jeb是的。我之所以喜欢这一点,是因为每个批处理文件都将在不同的命令外壳环境中运行,从调用外壳程序继承变量,并且在批处理完成后丢失对初始值的更改->每次连续运行后都不会再有任何垃圾了。另一个好处是,您不必处理脚本中的重置变量。
linux64kb '19

17

我认为它们的表现应该大致相同,但是存在一些差异。 START通常用于启动应用程序或启动给定文件类型的默认应用程序。这样,如果您START http://mywebsite.com不这样做START iexplore.exe http://mywebsite.com

START myworddoc.docx将启动Microsoft Word并打开myworddoc.docx。CALL myworddoc.docx做同样的事情...但是START为窗口状态和类似性质提供了更多选项。它还允许设置进程优先级和相似性。

简而言之,给定start提供的其他选项,它应该是您的选择工具。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.


8

这是我在并行运行批处理文件时发现的(使用相同的输入参数同时运行同一bat文件的多个实例):

假设您有一个执行长任务的exe文件,称为LongRunningTask.exe

如果直接从bat文件中调用exe,则只有对LongRunningTask的第一次调用会成功,而其余的将得到操作系统错误“进程已在使用文件”

如果使用此命令:

开始/ B / WAIT“”“ LongRunningTask.exe”“参数”

您将能够运行bat和exe的多个实例,同时仍然等待任务完成,然后bat继续执行其余命令。/ B选项是为了避免创建另一个窗口,为了使命令起作用,需要使用空引号,请参见下面的参考。

请注意,如果您一开始不使用/ WAIT,则LongRunningTask将与批处理文件中的其余命令同时执行,因此,如果其中一个命令需要LongRunningTask的输出,则可能会产生问题。

正在恢复:

这不能并行运行:

  • 调用LongRunningTask.exe

这将并行运行,并且只要命令的输出与bat文件的其余部分之间没有数据依赖性,就可以了:

  • 开始/ B“”“ LongRunningTask.exe”“参数”

这将并行运行并等待任务完成,因此可以使用输出:

  • 开始/ B / WAIT“”“ LongRunningTask.exe”“参数”

启动命令参考:如何从批处理文件运行程序,而在启动程序后不使控制台处于打开状态?


6

呼叫

不停止父批处理程序的情况下从另一个调用一个批处理程序。call命令接受标签作为呼叫目标。在脚本或批处理文件之外使用时,调用在命令行上无效。 https://technet.microsoft.com/zh-CN/library/bb490873.aspx

开始

启动一个单独的“命令提示符”窗口,以运行指定的程序或命令。如果不带参数使用,start将打开第二个命令提示符窗口。 https://technet.microsoft.com/zh-CN/library/bb491005.aspx


-1

这是一个旧线程,但是我刚遇到这种情况,并发现了一种巧妙的解决方法。我试图运行setup.exe,但是焦点是返回到脚本的下一行,而没有等待setup.exe完成。我没有运气尝试了上述解决方案。

最后,通过更多命令传递命令就成功了。

setup.exe {arguments} | 更多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.