通过连接到已运行的 PowerShell 进程可以完成一些有用的事情。 例如,这个答案使用该技术通过允许运行空间首先完成清理来优雅地停止目标 PowerShell 进程。 没有任何明显的停止进程的方法可以实现如此优雅的关闭。
该解决方案是通过在目标进程中创建运行空间和 powershell 类实例来实现的:
$pipe = [Runspaces.NamedPipeConnectionInfo]::new($Process.Id)
$rs = [runspacefactory]::CreateRunspace($pipe)
$rs.Open()
$ps = [powershell]::Create($rs)
PowerShell.Create(Runspace)
。 但是,该重载在 Windows PowerShell SDK 中不可用。
我对 PowerShell 远程处理和运行空间不太熟悉,也没有发现使用 Windows PowerShell 完成类似任务的明显方法。 是否可以?如果是的话,怎么办?
.Create(Runspace)
重载,但这对于 Windows PowerShell 5.1 来说不是问题,您只需将创建的运行空间分配给 .Runspace
属性:
# try from PowerShell 5.1
$proc = Start-Process pwsh -PassThru
$pipe = [System.Management.Automation.Runspaces.NamedPipeConnectionInfo]::new($proc.Id)
$rs = [runspacefactory]::CreateRunspace($pipe)
$rs.Open()
$ps = [powershell]::Create().AddScript('$PSVersionTable.PSVersion')
$ps.Runspace = $rs
$ps.Invoke()
$proc.Kill()