如何从托管的脚本中关闭父cmd控制台窗口?

Mak*_*i84 3 windows vbscript cmd

我在注册表中使用以下命令从Windows资源管理器的上下文菜单本地运行vbscript:

cmd /T:1F /K "cscript.exe //nologo "C:\Some Path\Some Folder\MyScript.vbs" "%1""

我使用/K交换机有两个原因:在脚本错误的情况下保持控制台窗口打开,并改变控制台的背面和前面的颜色(这实际上是通过/T交换机完成的,但出于某种原因,我不这样做了解,/C使用开关时颜色会恢复为默认值.

我的问题:如何在正常执行结束时关闭主机控制台窗口(附加到"cmd.exe"进程)?WScript.Quit显然会返回控制台提示符.我考虑过基于CommandLine的Win32_Process的WMI查询,但是如果使用相同的参数(即文件)多次调用脚本,那么这不起作用.有没有办法获得最顶层的父进程的id,例如,我可以用它来终止?

dbe*_*ham 5

我相信你可以简单地附加&&exit到你的命令字符串:

cmd /T:1F /K "cscript.exe //nologo "C:\Some Path\Some Folder\MyScript.vbs" "%1"&&exit"
Run Code Online (Sandbox Code Playgroud)

请注意,由于额外的引号,引用的参数不会被引用.你可能会更好:

cmd /T:1F /K ^"cscript.exe //nologo "C:\Some Path\Some Folder\MyScript.vbs" "%~1"^&&exit^"
Run Code Online (Sandbox Code Playgroud)


更新

脚本引擎在运行时错误时不设置退出代码 - 它将该任务留给脚本编写者.如果存在语法错误,它会设置正退出代码.这是一个非常不幸的设计.

我认为最简单的方法是修改你的VBS脚本,以便在成功时始终以负值退出:WScript.Quit -1.然后,只有在退出代码为负数时,才可以有条件地退出控制台.

cmd /T:1F /K ^"cscript.exe //nologo "C:\Some Path\Some Folder\MyScript.vbs" "%~1"^||if not errorlevel 0 exit^"
Run Code Online (Sandbox Code Playgroud)

  • 我使用`&&`而不是`&`,所以当脚本返回错误(即非零退出代码)时,将跳过`exit`. (2认同)
  • 一个小问题:如果脚本因语言错误而退出,则cscript返回错误代码0并且脚本似乎已成功.解决这个问题的唯一方法是"正常退出"返回一个固定的非零值,并在退出命令shell之前检​​查它. (2认同)