PowerShell中用Get-ProcessByName拆分Python/JAVA脚本进程并导出CSV
我来帮你搞定这个问题!核心问题是Get-Process返回的进程对象里,脚本名称其实藏在CommandLine属性里,而不是直接绑定在ProcessName上。我们需要逐个解析每个进程的命令行,提取出对应的脚本/程序名称,然后为每个进程生成独立的条目,最后导出到CSV就能实现一行一个脚本的效果了。
完整解决方案代码
# 处理Python进程:提取脚本名称并生成独立条目 $pythonProcesses = Get-Process python, python3 -ErrorAction SilentlyContinue | ForEach-Object { $cmdLine = $_.CommandLine # 用正则匹配命令行中的脚本名称(兼容带引号和不带引号的情况) if ($cmdLine -match 'python(?:3)?\.exe\s+("?)([^"\s]+)\1') { $scriptName = $matches[2] } else { # 处理交互式Python或无脚本的特殊情况 $scriptName = "Interactive Python Session" } # 生成自定义对象,每个进程对应一个对象(即CSV的一行) [PSCustomObject]@{ ProcessType = "Python" ScriptName = $scriptName PID = $_.Id ProcessName = $_.ProcessName } } # 处理Java进程:提取jar包或主类名称 $javaProcesses = Get-Process java -ErrorAction SilentlyContinue | ForEach-Object { $cmdLine = $_.CommandLine # 优先匹配jar包 if ($cmdLine -match '-jar\s+("?)([^"\s]+)\1') { $scriptName = $matches[2] } # 再匹配主类名(自动补充.class后缀方便识别) elseif ($cmdLine -match 'java\.exe\s+("?)([^"\s]+)\1') { $scriptName = $matches[2] + ".class" } else { $scriptName = "Unknown Java Process" } [PSCustomObject]@{ ProcessType = "Java" ScriptName = $scriptName PID = $_.Id ProcessName = $_.ProcessName } } # 合并进程列表并导出到CSV ($pythonProcesses + $javaProcesses) | Export-Csv -Path "ProcessMonitor.csv" -NoTypeInformation -Encoding UTF8
关键逻辑说明
- 逐个处理进程:用
ForEach-Object遍历每个Python/Java进程,确保每个进程生成一个独立的自定义对象,对应CSV里的一行。 - 命令行解析:通过正则表达式从进程的
CommandLine属性中精准提取脚本/jar/类名,兼容带引号和不带引号的命令行格式。 - 异常情况处理:针对交互式Python、无明确脚本的Java进程做了兜底,避免CSV出现空值或混乱条目。
- CSV导出优化:用
-NoTypeInformation去掉CSV开头的冗余类型信息,-Encoding UTF8保证中文脚本名不会乱码。
注意事项
- 如果你的Python可执行文件是
py.exe而非python.exe,需要调整正则中的匹配字符串; - 部分进程的
CommandLine属性需要管理员权限才能读取,若获取不到可以尝试以管理员身份运行PowerShell; - Java的命令行参数可能更复杂(比如前置的
-D参数),可以根据实际情况修改正则匹配规则。
内容的提问来源于stack exchange,提问作者Khushboo
相关产品推荐
相关产品推荐

