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