0

我有一个函数调用一个命令,该命令在远程服务器上启动一个新的 ps 会话。调用命令有一个 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,但没有运气。

4

3 回答 3

0

Try/Catch 应该在调用命令中工作。我通常不会对会话调用命令,而是使用 -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!” 也是。

也许是因为您试图从会话中结束会话。您应该处理调用命令或函数的输出,然后基于此处理会话。

就像使用我蹩脚的例子......

$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 }
于 2018-03-15T09:41:07.463 回答
0

好的,所以我想通了 - ps 会话和调用命令是红鲱鱼。其基础是您不能退出 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
 #{ }
于 2018-03-14T22:29:24.940 回答
0

我不知道这是否适用于 PSSession,并且我没有测试它的环境,但是您可以使用它在 try catch 中退出 powershell

[Environment]::Exit(0)
于 2018-03-14T23:40:27.920 回答