2014-09-22 4 views
0

У меня есть командлет PowerShell, который я использую для упрощения подключения к другому компьютеру с RDP.Автоматическое удаление задания PowerShell после его завершения (асинхронно)

В этих командах, я бег сделайте следующее:

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 получит возможность установить соединение, и я хочу, чтобы этот командлет был автономным, - немедленно возвращает управление пользователям командная строка, так что я могу запускать другие команды, в то время как я также использую сеанс RDP, который означает, что я не могу ждать для работы, чтобы закончить как то значит, что я застрял ждать, пока я не отключиться от удаленного сеанса:

| Wait-Job | Remove-Job 

То, что я хочу сделать, - это иметь возможность Remove-Job после его завершения, возможно, используя какой-то обратный вызов, поэтому мне не нужно вручную запускать другую команду для очистки задания после того, как я выйду из RDP sess и Иов не остается в состоянии Completed (это то, что я сейчас делаю, но, очевидно, это не «чистый»).

Для полного командлета вы можете увидеть его здесь больше контекста:

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 

Затем дайте ваше соединение имя, когда вы делаете ваш Start-Job, прилагая -Name $ComputerName до конца команды. Таким образом, через 5 минут после запуска запускается запланированное задание, которое находит и очищает эту работу по имени.

+0

Извините за медленный ответ, я попробовал, но это задание находится в списке Get-Job/Get-EventSubscriber, ожидающем очистки после завершения, тем не менее, будет иметь ту же проблему. Подход, который я принял сейчас, - создать новый узел PowerShell (https://github.com/paulmarsy/Console/tree/master/AdvancedPowerShellConsole/Exports/Functions/Threading), добавив туда код очистки и запустив его с помощью BeginInvoke , Он не идеален, так как он использует больше ресурсов, и я не называю EndInvoke в настоящее время (в противном случае он ждет его завершения), но надеемся исправить его с помощью события InvocationStateChanged. – Paul