如何使用wmic获取特定进程的进程ID并检查错误?

时间:2016-01-04 11:39:52

标签: batch-file cmd

我创建了一个批处理脚本,它运行WMIC以从特定进程获取PID。如果我打开bat脚本,我会看到'ProcessID 1234'或'No Instance(s)Available'。在命令窗口中。

我想创建一个IF语句,检查此命令的输出是PID还是No Instance(s) Available.。我可以使用哪个变量?

我的代码:

wmic process where "Name like '%%cmd.exe%%' and CommandLine like '%%WatchdogStarter.bat%%'" get processid
if %%outputfromthiswmiccommand%% == 'No Instance(s) Available.' ....

4 个答案:

答案 0 :(得分:6)

您可以使用以下批处理代码来获取流程标识符值或分配给变量echo /?的错误消息。

for /?

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • if /?
  • set /?
  • wmic /?
  • 2>nul
  • No Instance(s) Available.

另请参阅Using command redirection operators以了解2>nul STDERR 写入 STDERR 的错误消息^(英文Windows)重定向到设备 NUL 。必须使用2>nul转义ProcessID中的尖括号以应用function day_check($paymentDate, $paymentDay = 1) { $CI =& get_instance(); $dateParts = explode("-", $paymentDate); $holQ = $CI->db->query("SELECT * FROM holidays WHERE holidayDate = '$paymentDate'"); $holR = $holQ->row(); if ($paymentDay <= 0) { $paymentDay = 1; } // while -> if if (($holR->holidayDate == $paymentDate) || (date("l", strtotime($paymentDate)) == 'Saturday') || (date("l", strtotime($paymentDate)) == 'Sunday')) { echo "$paymentDate: $paymentDay <br>"; $refinedDay = $dateParts[2] + 1; if ($refinedDay < 10) { $refinedDay = "0" . $refinedDay; } $paymentDate = $dateParts[0] . "-" . $dateParts[1] . "-" . ($refinedDay); $paymentDay = $dateParts[2] + 1; return day_check($paymentDate, $paymentDay); // return! // break; // no need } echo "Final: $paymentDate: $paymentDay <br>"; return $paymentDay; } 来命令 wmic 而不是命令 FOR

将错误消息重定向到设备 NUL ,如果 wmic 命令不成功,则确保while不存在,这比比较 wmic的输出要好使用特定字符串作为错误消息取决于Windows的语言。此解决方案独立于Windows语言。

答案 1 :(得分:2)

感谢所有帮助人员。 我通过使用TASKLIST而不是WMIC解决了我的问题。

WMIC给了我输出,从2个非ascii字符和2行不可用信息开始。我必须过滤这些,有效。

@echo off
for /f "skip=1 tokens=*" %%i in ('wmic process where name^="chrome.exe" get Processid') do echo %%i

这种方法有用,但是当我试图“观看”的程序没有运行时,它给了我一个随机的pid,我认为我得到的pid来自正在查询请求的进程ID的WIDC进程。

这就是为什么我尝试使用TASKLIST并使用FINDSTR搜索完整输出以找到我正在寻找的正确pid。这对我有用。

for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P

感谢所有帮助!:)

答案 2 :(得分:1)

我也认为你的引号有问题(或者我的例子中有双引号):例如我的脚本中有以下代码:

IF "%5"==""

你看到&#39; ==&#39;的两边都有(双)引号。登录。

换句话说,我会用以下代码替换你的行:

if '%%outputfromthiswmiccommand%%' == 'No Instance(s) Available.' ....

答案 3 :(得分:0)

如果wmic未能找到PID%errorlevel%将被设置。在IF语句中使用它。