2014-09-22 65 views
0

我有一個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的,你可以在這裏看到更多的上下文:

https://github.com/paulmarsy/Console/blob/master/AdvancedPowerShellConsole/Exports/Functions/Connect-Remote.ps1

回答

1

所以註冊scheduledjob在5分鐘內,將刪除該完成的作業運行。我敢肯定,你可以這樣做:

Register-ScheduledJob -ScriptBlock {param($computername); Wait-Job -Name $ComputerName|remove-job} -Trigger @{Frequency="Once";At=(get-date).AddMinutes(5).ToString("h:MM tt")} -argumentlist $computername 

然後,只需給你的連接名稱,當你通過追加-Name $ComputerName到命令的結尾做你的啓動工作。以這種方式啓動它5分鐘後,一個計劃任務開始,找到並清除名稱的工作。

+0

對不起,答覆很慢,我試了一下,但這個工作是在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