Exit not Exiting в invoke-command в удаленном сеансе ps
У меня есть функция вызывает команду, которая запускает новый сеанс PS на удаленном сервере. Команда invoke имеет предложение Exit, однако это не выход?
Function CreateID{
Invoke-Command -Session $Script:sesh -ScriptBlock{
Set-Location c:\
Import-Module ActiveDirectory
Try
{
If (Get-ADGroupMember "$Using:IDGroup" | Where-Object Name -match
"$Using:Computer")
{
Write-Host "Already in $using:IDGroup Exiting Script"
Disconnect-PSSession -Session $Script:sesh
Exit-PSSession
Exit
}
}
Catch
{ }
Write-Host "Did not Exit"
}
}
Команда Get-AD работает нормально, поэтому там, где она не должна отображать "не завершено", она работает - как я могу выйти из блока сценариев в удаленном сеансе PS?
Я пробую сеанс отключения и Exit-pssession, чтобы увидеть, будут ли они делать то же самое, что и просто выход, но ни один из них не работает.
Я также попробовал Break и не повезло.
3 ответа
Я не знаю, работает ли это для PSSession или нет, и у меня нет среды для его тестирования, но вы можете использовать это для выхода из powershell в рамках попытки try
[Environment]::Exit(0)
Итак, я понял это - сессия ps и команда invoke- красные сельди. Основой этого является то, что вы не можете выйти из оператора Try/Catch.
Я должен был сделать это, чтобы заставить его работать - теперь это Выход. Я просто не могу использовать Try/ Catch - если кто-нибудь знает, как выйти из Try/Catch, дайте мне знать!
#Try
#{
If (Get-ADGroupMember "$Using:IDGroup" | Where-Object Name -match
"$Using:Computer")
{
Write-Host "Already in $using:IDGroup Exiting Script"
Disconnect-PSSession -Session $Script:sesh
Exit-PSSession
Exit
}
#}
#Catch
#{ }
Try/Catch должен работать в команде invoke. Я обычно не вызываю команды для сессий, я использую -ComputerName.
Это работало нормально для меня:
invoke-command -ComputerName "MyDomainController" -ScriptBlock {
try { get-aduser "ValidUser" } catch { "doh!" }
}
Я только что попробовал это, и это также сработало:
$sess1 = New-PSSession -ComputerName MyDomainController
invoke-command -Session $sess1 -ScriptBlock { try { get-aduser "ValidUser" } catch { "doh!" } }
Если я изменю любое из этих значений "ValidUser" на недопустимых пользователей, я вижу "doh!" также.
Возможно, это потому, что вы пытаетесь завершить сеанс изнутри сеанса. Вы должны иметь дело с выводом команды invoke или функции, а затем обрабатывать сессию, основываясь на этом.
Как, например, использовать мой неудачный пример...
$sess1 = New-PSSession -ComputerName MyDomainController
$DoStuff = invoke-command -Session $sess1 -ScriptBlock { try { get-aduser "ValidUser" } catch { "doh!" } }
If ($DoStuff -eq "doh!") { Remove-PSSession $sess1 } else { $DoStuff }