我需要从 PowerShell (v1.0) 脚本中识别正在执行的批处理文件的 P(process) ID。任何人都可以建议这样做的方法吗?
谢谢,魔术师安迪。
我需要从 PowerShell (v1.0) 脚本中识别正在执行的批处理文件的 P(process) ID。任何人都可以建议这样做的方法吗?
谢谢,魔术师安迪。
好吧,这是否可能取决于您执行批处理文件的方式。
通常,您可能会发现这一点的唯一方法是查看用于启动批处理的命令行。如果您在 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
但是,如果您直接从命令提示符启动批处理,那么您无法从外部发现批处理正在运行以及是谁启动了它。
我找到了一种发现正在运行的批处理文件的 PID 的方法。您需要在批处理文件中设置批处理控制台窗口的标题以识别它:
...
Title MyBatchWindow
...
在 PowerShell 脚本中,您可以检查 MainwindowTitle 属性并从与您的批处理窗口标题匹配的进程中检索 PID:
$batchProcess = get-process cmd | where-Object {$_.MainWindowTitle -eq "MyBatchWindow"}
$processID = $batchProcess .ID
...
我已经测试过这个方法,它似乎在你通过双击它来调用批处理文件的地方,或者通过从命令行调用它来工作。
我不相信这是可能的可靠方式。批处理文件本身不会启动单独的进程,而是在 cmd.exe 实例中运行。没有从该特定进程导出的数据可以可靠地告诉您正在运行什么文件。
一个例外是,如果专门启动 cmd.exe 实例来运行批处理文件。在这种情况下,它会出现在应用程序的命令行中,并且可以通过 grep 命令行获取批处理文件。尽管从 cmd.exe 提示符中运行多个批处理文件,但这并不能解决正常情况。