【问题标题】:How to close the parent cmd console window from within the script it's hosting?如何从它托管的脚本中关闭父 cmd 控制台窗口?
【发布时间】:2013-09-30 17:52:34
【问题描述】:

我在注册表中使用以下命令从 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,然后我可以用它来终止?

【问题讨论】:

    标签: windows vbscript cmd


    【解决方案1】:

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

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

    请注意,由于额外的封闭引号,您引用的参数没有被引用。你可能会更好:

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


    更新

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

    我认为最简单的做法是修改您的 VBS 脚本,使其在成功时始终以负值退出:WScript.Quit -1。然后,只有当退出代码为负时,您才能有条件地退出控制台。

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

    【讨论】:

    • 呵呵.. 我不知道为什么我没有想到这一点,也许我的印象是/K 会覆盖任何退出命令。无论如何,完美运行,谢谢!
    • 我会使用&&而不是&,因此当脚本返回错误(即非零退出代码)时将跳过exit
    • @AnsgarWiechers - 很好的收获。我错过了“正常执行”约束。
    • @Makaveli84 - 已根据 Ansgar 的好建议更新了答案。
    • 一个小问题:如果脚本由于语言错误而退出,cscript 将返回错误代码 0,并且脚本似乎已经成功。解决这个问题的唯一方法是“正常退出”返回一个固定的非零值,并在退出命令 shell 之前检查它。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 2012-10-14
    • 2012-05-02
    • 2023-03-07
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多