我有一個PowerShell cmdlet,我用它來簡化與RDP的另一臺計算機的連接。自動刪除PowerShell作業(異步)
在該cmdlet我運行做到以下幾點:
if ($null -ne $Username -and $null -ne $Password) {
Start-Process -FilePath "cmdkey.exe" -ArgumentList @("/generic:`"TERMSRV/$ComputerName`"", "/user:`"$Username`"", "/pass:`"$Password`"") -WindowStyle Hidden
}
Start-Job -ScriptBlock {
param($InstallPath, $ComputerName, $Port, $Username, $Password)
$arguments = @("`"$(Join-Path $InstallPath '\Support Files\MSTSC\Default.rdp')`"")
if ($null -ne $Port) {
$arguments += "/v:`"$($ComputerName):$($Port)`""
} else {
$arguments += "/v:`"$($ComputerName)`""
}
Start-Process -FilePath "mstsc.exe" -ArgumentList $arguments -Wait
if ($null -ne $Username -and $null -ne $Password) {
Start-Process -FilePath "cmdkey.exe" -ArgumentList @("/delete:`"TERMSRV/$ComputerName`"") -WindowStyle Hidden
}
} -ArgumentList @($InstallPath, $ComputerName, $Port, $Username, $Password)
正如你可以看到我添加一個用於連接到遠程計算機的憑據,然後開始執行這一個的mstsc.exe工作,等待其完成然後刪除證書。
問題是我必須等待mstsc在刪除證書之前關閉,否則它們會在mstsc有機會建立連接之前被刪除,並且我希望此cmdlet是自包含的 - 將控制立即返回給用戶命令提示符,所以我可以同時我也使用RDP會話,這意味着我不能等待作業完成作爲平均值我堅持等到我從遠程會話斷開運行其他命令:
| Wait-Job | Remove-Job
我想要做的是在Remove-Job完成後,可以使用某種回調,因此我無需手動運行另一個命令來清理作業,一旦我退出RDP sess並且Job不會處於Completed狀態(這是我目前正在做的,但顯然這不是'乾淨的)。
對於全cmdlet的,你可以在這裏看到更多的上下文:
對不起,答覆很慢,我試了一下,但這個工作是在Get-Job/Get-EventSubscriber列表等待完成後清理完畢,所以仍然有同樣的問題。我現在採用的方法是創建一個新的PowerShell主機(https://github.com/paulmarsy/Console/tree/master/AdvancedPowerShellConsole/Exports/Functions/Threading),在那裏添加清理代碼並使用BeginInvoke啓動它。它不完美,因爲它使用更多的資源,我目前不調用EndInvoke(否則它會等待它完成),但希望使用InvocationStateChanged事件修復它。 – Paul 2014-10-13 22:06:39