如何获取PowerShell作业的进程句柄/PID?如何创建自定义命名测试进程?
问题解答
核心问题:从PowerShell作业获取进程ID
PowerShell作业的ChildJobs集合中包含对应后台进程的详细信息,直接通过$job.ChildJobs[0].InstanceId即可获取作业对应的进程ID,用进程ID过滤比句柄更准确。
修改后的示例代码:
$jobName = "TestJob" $job = Start-Job -Name $jobName -ScriptBlock { while ($true) { Start-Sleep -Seconds 1 } } # 获取作业对应的进程ID $jobProcessId = $job.ChildJobs[0].InstanceId # 匹配对应的进程 $jobProcess = Get-Process | Where-Object {$_.Id -eq $jobProcessId}
延伸问题:创建可自定义标识的进程用于测试
PowerShell作业本质是后台运行的powershell.exe(或pwsh.exe)进程,无法修改其进程名,但可以通过以下方式实现可识别的测试进程:
方法1:通过窗口标题标识进程
启动进程时指定自定义窗口标题,后续通过窗口标题过滤:
$processTitle = "test-Get-Foo.1.2" # 启动后台运行的PowerShell进程并设置窗口标题 $proc = Start-Process powershell.exe -ArgumentList "-Command", "`$Host.UI.RawUI.WindowTitle='$processTitle'; while(`$true){Start-Sleep 2}" -WindowStyle Hidden -PassThru # 后续通过窗口标题过滤进程 $targetProc = Get-Process powershell | Where-Object {$_.MainWindowTitle -eq $processTitle}
方法2:直接获取进程对象(无需事后过滤)
使用Start-Process的-PassThru参数,启动时直接拿到进程对象,无需后续匹配:
$proc = Start-Process powershell.exe -ArgumentList "-Command", "while(`$true){Start-Sleep 2}" -WindowStyle Hidden -PassThru # 直接对$proc进行操作,例如停止进程: # $proc | Stop-Process -Force
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

