【发布时间】:2019-07-24 09:08:40
【问题描述】:
我想运行一个批处理文件 A,它调用/启动另一个批处理文件 B,它打开一个新的 cmd 窗口。然后我想在这个新的 cmd 窗口中运行一个用户定义的命令。该命令只有在运行文件 B 后或在这个新的 cmd 窗口中才能被识别,但命令本身的调用应该写在文件 A 中(文件 B 已设置且不能更改)。我该怎么做?
据我了解,我无法访问由另一个批处理文件打开的 cmd 窗口。我写了一个简单的测试用例来说明问题,见下文。
我已经尝试过call 和start。如果我在 cmd 窗口中手动运行批处理文件 B,我可以在同一窗口中运行用户定义的命令,因为当前 cmd 窗口已“更新”并且该命令被识别。
简单的测试用例:
在此示例中,文件 A 中 call scriptB.bat 之后的所有命令都将被忽略(可能是因为这些命令在旧 cmd 窗口中运行,该旧 cmd 窗口被在 B 中打开的新 cmd 窗口“覆盖”,现在处于活动状态)。如何将命令(尤其是用户定义的命令)传递到新的 cmd 窗口?
scriptA.bat:
@echo off
echo Start script!
call scriptB.bat
%user_command%
echo End script!
pause
scriptB.bat:
@echo off
set user_command=echo USER COMMAND!
cmd
输出:
Start script!
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
*my Path*>
【问题讨论】:
-
恐怕我帮不了你。但出于好奇:你为什么需要这个?
-
我尝试使用 Jenkins 为软件设置构建服务器,我需要通过批处理文件运行自定义构建环境/构建命令。这个自定义构建环境会打开一个新的 cmd 窗口,我可以在其中运行自定义构建命令。
-
首先让我们明确条款。您的示例中的任何内容都不会创建新的控制台窗口。只有没有
/B选项的start会创建一个新窗口。cmd只是运行 CMD shell 的一个新实例,它将继承父级的控制台窗口(如果有)。与任何其他控制台应用程序一样,cmd.exe 不会创建或托管它使用的控制台。控制台是由 Windows 7+ 中的 conhost.exe 实例托管的共享系统资源。 cmd.exe 进程甚至不一定附加到控制台。 -
如果 scriptB.bat 真的像那样启动一个新的 cmd.exe 实例,我认为不幸的是它写得不好。它应该只设置它当前的外壳,而不是创建外壳的新实例。这样调用者就可以运行类似
start "" cmd /v:on /k "scriptB.bat & "!user_command!""。 -
@eryksun 感谢您的回复和信息 :-) 我找到了一种绕过在我的真实批处理脚本中创建 shell 实例的方法。这在某种程度上“解决”了我的问题。
标签: windows batch-file cmd