如何编写适用于Unix平台的PowerShell KillChildren函数
跨平台PowerShell版KillChildren函数实现
原Windows平台的KillChildren函数依赖Windows专属的Get-CimInstance cmdlet,无法在macOS/Linux等Unix类系统运行。以下是单文件跨平台版本,通过PowerShell内置的平台自动变量区分逻辑分支,无需维护多套脚本:
function KillChildren { Param ( [Parameter(Position = 0, Mandatory, ValueFromPipeline)] [int[]]$ProcessId, [switch]$PassThru ) process { foreach ($p in $ProcessId) { # 根据平台获取子进程ID $childPids = if ($IsWindows) { # Windows分支:保留原逻辑,排除conhost进程 Get-CimInstance -Class Win32_Process -Filter "ParentProcessId = '$p' AND NOT Name LIKE 'conhost%'" -Property ProcessId | Select-Object -ExpandProperty ProcessId } else { # Unix分支(macOS/Linux):使用ps命令获取子进程 # 输出格式:PID PPID,过滤PPID等于目标PID的进程,提取PID ps -eo pid,ppid | Where-Object { $_ -match "^(\d+)\s+$p$" } | ForEach-Object { $matches[1] } } # 递归处理子进程的子进程,然后终止 if ($childPids) { $childPids | KillChildren -PassThru | ForEach-Object { Stop-Process -Id $_ -ErrorAction Ignore -Force } } # 若指定PassThru,输出当前PID if ($PassThru) { $p } } } }
关键细节说明
- 平台区分逻辑:使用PowerShell 7+内置的自动变量
$IsWindows、$IsMacOS、$IsLinux自动判断运行环境,无需手动指定。 - Windows分支:完全保留原函数的
Get-CimInstance逻辑,确保原有功能不受影响,同时排除conhost进程(避免误杀控制台关联进程)。 - Unix分支:
- 利用Unix系统原生的
ps命令获取进程列表,-eo pid,ppid指定输出进程ID(PID)和父进程ID(PPID)。 - 通过正则匹配筛选出父ID等于目标PID的进程,提取子进程ID。
- 统一使用PowerShell跨平台cmdlet
Stop-Process终止进程,保证逻辑一致性。
- 利用Unix系统原生的
- 递归与PassThru:保持原函数的递归处理逻辑(先杀最深层的子进程,再回溯),
-PassThru参数功能与原版本完全一致,会输出所有被处理的进程ID。
使用示例
# 获取目标进程ID $targetPid = (Get-Process -Name "SomeProcess").Id # 杀掉该进程的所有子进程,同时输出被处理的PID列表 KillChildren -ProcessId $targetPid -PassThru
内容的提问来源于stack exchange,提问作者Grant Birchmeier
相关产品推荐
相关产品推荐

