【问题标题】:How can I run commands on existing cmd window from another cmd window?如何从另一个 cmd 窗口在现有 cmd 窗口上运行命令?
【发布时间】:2015-07-23 07:47:17
【问题描述】:

我有一个正在运行的命令提示符实例(我们称之为 A)。 A 需要 10 分钟的时间来加载(加载包括初始化、运行一些先决条件命令等)。 我还有一个正在运行的命令提示符实例(我们称之为 B)。 B 只是简单的命令提示符。

现在我想从 B 实例对 A 实例运行命令。 就像是, 例如

cmd B:> call A.exe "dosomething"

现在我想在一个 cmd 实例上运行“dosomething”。

我尝试使用 wmic

C:\Users\dbe1>wmic process where 'caption like "%cmd.exe"' get  name, processid
Name     ProcessId
cmd.exe  2628
cmd.exe  17620

我得到了进程 ID。现在我可以调用以在这个进程 ID 上创建、创建等。

wmic process where processid="18172" call terminate

它工作得很好,因为windows可以理解terminate方法。我想在这里调用“dosomething”,这是我的自定义要求。

有可能吗?

【问题讨论】:

    标签: windows command-line cmd command-prompt wmic


    【解决方案1】:

    阅读Win32_Process Methods

    Win32_Process 类公开了以下方法:

    • AttachDebugger 方法:为进程启动当前注册的调试器;
    • Create 方法:创建一个新进程;
    • GetAvailableVirtualSize 方法:检索进程可用的空闲虚拟地址空间的当前大小(以字节为单位);
    • GetOwner方法:获取进程运行的用户名和域名;
    • GetOwnerSid 方法:检索进程所有者的安全标识符(SID);
    • SetPriority方法:尝试改变进程的执行优先级;
    • Terminate 方法:终止进程及其所有线程。

    【讨论】:

    • 我不想调用 Windows 提供的默认方法,如 Terminate、Create 等。我想运行另一个批处理文件。
    【解决方案2】:

    您必须让在 A 中运行的东西能够被告知要做什么,但您可以做到:在 cmd 脚本 A.cmd 中,在 cmd.exe A 中运行,添加以下内容:

    waitfor dosomething
    

    然后在 cmd.exe B 中键入以下内容:

    waitfor /SI dosomething
    

    A.cmd(以及当时执行waitfor dosomething 的任何其他实例或运行cmd 脚本)将执行脚本的下一行:这可能是硬编码到A.cmd 中的东西,或者您可以执行类似的操作以下:

    B.cmd:

    echo @echo Hello World > dosomething.cmd
    waitfor /SI dosomething
    

    A.cmd:

    waitfor dosomething
    if EXIST dosomething.cmd call dosomething.cmd
    

    这样做的一个缺点是每个单独的 cmd.exe 都不是多线程的,但您可以通过运行多个实例来克服这一点(即多进程而不是多线程);您还必须将每个实例放入自己的文件夹中,这样它就有自己的 dosomething.cmd 副本进行操作。

    B.cmd:

    echo @echo Hello A instance 1 > \A1\dosomething.cmd
    echo @echo Hello A instance 2 > \A2\dosomething.cmd
    
    REM both instances will be signaled by the following line
    waitfor /SI dosomething
    

    【讨论】:

    • 感谢@John 的详细解释。我明白了。我已经尝试过并且可以无缝工作,除了一点小故障。现在,我将 **dosomething ** 信号从 A.cmd 发送到 B.cmd。我在 B.cmd 收到“收到信号”消息。如果 B.cmd 等待超过 1 个信号,有什么方法可以在 B.cmd(目标)上运行特定脚本,具体取决于它接收到的信号名称?
    • 不是多线程的......我的原始答案解决了这个问题:运行多个 b.cmd 实例,每个实例都有自己的操作脚本来执行
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多