1

我需要从 PowerShell (v1.0) 脚本中识别正在执行的批处理文件的 P(process) ID。任何人都可以建议这样做的方法吗?

谢谢,魔术师安迪。

4

3 回答 3

3

好吧,这是否可能取决于您执行批处理文件的方式。

通常,您可能会发现这一点的唯一方法是查看用于启动批处理的命令行。如果您在 Windows 资源管理器中双击批处理文件,您将获得如下命令行

cmd /c ""C:\Users\Me\test.cmd" "

在 Powershell 中,您可以使用Get-WMIObject其中Win32_Process包括命令行:

PS Home:\> gwmi Win32_Process | ? { $_.commandline -match "test\.cmd" } | ft commandline,processid -auto

commandline                             processid
-----------                             ---------
cmd /c ""C:\Users\Me\test.cmd" "             1028

但是,如果您直接从命令提示符启动批处理,那么您无法从外部发现批处理正在运行以及是谁启动了它。

于 2009-08-27T16:49:34.130 回答
3

我找到了一种发现正在运行的批处理文件的 PID 的方法。您需要在批处理文件中设置批处理控制台窗口的标题以识别它:

...
Title MyBatchWindow
...

在 PowerShell 脚本中,您可以检查 MainwindowTitle 属性并从与您的批处理窗口标题匹配的进程中检索 PID:

$batchProcess = get-process cmd | where-Object {$_.MainWindowTitle -eq "MyBatchWindow"}
$processID = $batchProcess .ID
...

我已经测试过这个方法,它似乎在你通过双击它来调用批处理文件的地方,或者通过从命令行调用它来工作。

于 2009-08-27T16:57:33.617 回答
1

我不相信这是可能的可靠方式。批处理文件本身不会启动单独的进程,而是在 cmd.exe 实例中运行。没有从该特定进程导出的数据可以可靠地告诉您正在运行什么文件。

一个例外是,如果专门启动 cmd.exe 实例来运行批处理文件。在这种情况下,它会出现在应用程序的命令行中,并且可以通过 grep 命令行获取批处理文件。尽管从 cmd.exe 提示符中运行多个批处理文件,但这并不能解决正常情况。

于 2009-08-27T16:46:09.380 回答