【问题标题】:Start a program with WMIC and get its output使用 WMIC 启动程序并获取其输出
【发布时间】:2016-11-01 05:24:43
【问题描述】:

我正在尝试运行一个程序并获取其 PID,以便在程序在执行期间挂起时终止该程序。我无法杀死带有程序名称的程序,因为在 PC 上运行的程序不止一个。 我遇到了论坛并得到了 wmic 使用的建议,但是我无法通过使用 wmic 调用它来获得程序的输出。

这与这篇文章中提到的问题大致相同: Remote Netstat to STDOUT with WMIC?

我按照建议尝试了这个命令来执行程序并输出:

   wmic process call create "cmd /C > C:\temp\test.txt 2>&1 netstat.exe -ano" 

使用这个命令,我可以检索程序的输出,但是程序实际上是从另一个 cmd 调用的?这违背了我最初尝试使用 wmic 的初衷。

任何人都可以告诉我是否有另一种方法来获取输出或另一种方法来从批处理中调用程序,获取它的 PID 和被调用程序的输出重定向?

【问题讨论】:

  • wmic Process Call Create ... 输出相关的ProcessId,因此您可以稍后通过另一个wmic 命令行使用它,使用Where ProcessId=...,如wmic Process Where ProcessId=... Call Terminate,或taskkill /PID ......

标签: batch-file


【解决方案1】:

因为你只需要PID来杀死进程,你也可以使用windowtitle:

start "UniqueWindowTitle" cmd /c "ping /t google.de >out.txt 2>&1"
timeout /t 10
taskkill /fi "WINDOWTITLE eq UniqueWindowTitle" 2>nul
type out.txt

您还可以将/min 添加为start 开关以不显示该框。

【讨论】:

  • 谢谢!!这看起来像我现在真正需要的。将 uniqueWindowTitle 分配给程序并在此之后将其杀死。谢谢!! :)
  • 大声笑...实际上这两个脚本看起来都没有问题。只有 taskkill 的 /F 选项会导致所有问题。在没有“/F”的情况下,在cmd或wmic中调用的子程序成功杀死。或者使用“/F /T”也可以。谢谢你们! :)
  • 是的,简单的taskkill(没有/f)就像“你能停下来吗?”,但/f告诉taskkill只需使用它的枪并在没有警告。
【解决方案2】:

这是这个问题的一个例子:How to capture the PID of a process when launching it in DOS ?

@echo off
rem there is a tab in the file at the end of the line below
set tab=    
set "cmd=cmd /k ^> C:\temp\test.txt 2^>^&1 netstat.exe -ano"
set dir=%~dp0

echo Starting MyProg
set pid=notfound

for /F "usebackq tokens=1,2 delims=;=%tab% " %%i in (
    `wmic process call create "%cmd%"^, "%dir%"`
) do (
    if %%j gtr 0 (
        set "pid=%%j"
    )
)
Call :Trim "%pid%"
echo MyPID = "%pid%"
echo Hit any key to kill the process created by WMIC 
pause>nul
Taskkill /F /PID %pid%
pause & exit
::*************************************************************************************
:Trim <String>
set "vbsfile=%tmp%\%~n0.vbs"
(
    echo Wscript.echo Trim("%~1"^)
)>"%vbsfile%"
for /f "delims=" %%a in ('Cscript /nologo "%vbsfile%"') do ( set "pid=%%a" )
If Exist "%vbsfile%" Del "%vbsfile%"
exit /b
::*************************************************************************************

【讨论】:

  • 您好,Hackoo,感谢您的回复。这看起来不像我需要的。可能我给出了一个我想运行的程序的简单示例。该程序类似于 putty.exe(不完全是 putty,但行为相同),其中 cmd 在新窗口上调用预期程序,而不是在 cmd 本身内执行。使用上面给出的脚本,这里出现的 PID "echo MyPID = "%pid%"" 是 cmd 的 PID,而不是预期程序的 PID。当 wmic 杀死 PID 时,它只是关闭 cmd 窗口而不是意图程序。希望我这次解释得足够清楚。
猜你喜欢
  • 2011-07-26
  • 2011-05-16
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多