我有一个函数调用一个命令,在远程服务器上启动一个新的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会话中的scriptblock?
我正在尝试断开会话和Exit-pssession,看看他们是否会像退出那样做同样但没有一个能正常工作。
我也尝试过休息而没有运气。
答案 0 :(得分:0)
好的,所以我想出来了 - ps会话和invoke-command是红色的鲱鱼。这样做的基础是你不能退出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
#{ }
答案 1 :(得分:0)
我不知道这是否适用于PSSession,我没有测试它的环境,但您可以使用它在try catch中退出powershell
[Environment]::Exit(0)
答案 2 :(得分:0)
Try / Catch应该在invoke-command中工作。 我通常不会对会话调用命令,而是使用-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-command或函数的输出,然后根据它处理会话。
喜欢使用我的蹩脚例子......
$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 }