【问题标题】:Passing Remote Powershell Variables传递远程 Powershell 变量
【发布时间】:2020-06-19 02:41:11
【问题描述】:

我正在尝试编写简单的脚本来提高我的 powershell 能力,我想我经常做的事情是通过服务器管理器或远程 powershell 会话来停止我们的 RDS 服务器以应用更新等。

我尝试根据我的输入编写一个脚本来执行此操作,但无论我做什么,变量的内容都不会传递到远程服务器。

脚本只是询问您希望更改哪个服务器,您希望将其更改为何种状态,将两者的值结合起来,然后将其传递到远程服务器。

唉……什么都没有。代码如下。任何指针将不胜感激。

$SessionHosts = "Server_1", "Server_2", "Server_3", "Server_4" 

$OpeningSalvo = Read-Host -Prompt "[Q]uery Servers or [C]hange State?"

If ($OpeningSalvo -match "q")

    {   
         Invoke-Command $SessionHosts {chglogon.exe /query}

    }

Elseif ($OpeningSalvo -match "c")

    {

        $Server = Read-Host -Prompt "Server Name?"    

        $State = Read-Host -Prompt "Enable, Drain, Drainuntilrestart or Disable"

        $Run = "chglogon.exe /" + "$State"

        #Invoke-Command -ComputerName $Server -ScriptBlock {Write-Host $Fun $using:Run echo $Fun}

        #$ScriptBlockContent1 = {param ($Run) Write-Host $Run} 
        #Invoke-Command $Server $ScriptBlockContent1 -ArgumentList $Run

        $ScriptBlockContent1 = {param ($Run) Write-Output $Run} 
        Invoke-Command $Server $ScriptBlockContent1 -ArgumentList $Run

        $ScriptBlockContent2 = {Write-Host $Run}
        Invoke-Command $Server $ScriptBlockContent2

    }

Else  

    {
        Write-Host "End"
    }

我已经设法使用以下 powershell 脚本来完成这项工作,但是,它有点笨拙!

$SessionHosts = "Server_1", "Server_2", "Server_3", "Server_4" 

$OpeningSalvo = Read-Host -Prompt "[C]hange State, [Q]uery Servers or [E]xit?"

If ($OpeningSalvo -match "q")

    {   
         Invoke-Command $SessionHosts {chglogon.exe /query}

    }

Elseif ($OpeningSalvo -match "c")

    {

        $Server = Read-Host -Prompt "Server Name?"    

        $State = Read-Host -Prompt "[1] Enable, [2] Drain, [3] Drain until restart, [4] Disable all connections"

        If ($State -match "1") 
                {Invoke-Command $Server {chglogon.exe /enable}}

        Elseif ($State -match "2")
                {Invoke-Command $Server {chglogon.exe /drain}}

        Elseif ($State -match "3")
                {Invoke-Command $Server {chglogon.exe /drainuntilrestart}}

        Elseif ($State -match "4")
                {Invoke-Command $Server {chglogon.exe /disable}}


    }

Else  

    {
        Write-Host "End"
    }

顺便说一句,第一个实例中 chggon.exe /query 的输出有点冗长。

有什么建议可以将其通过管道传输到内存中,然后将服务器名称和状态提取出来?我确信我可以很好地格式化它。

事实上,任何建议都将不胜感激!这个脚本变得越复杂和有用,我就会学到越多!可能会有错误,但这是我的第一个脚本! :)

"会话登录当前已启用 + CategoryInfo:未指定:(会话登录当前启用:字符串)[],RemoteException + FullyQualifiedErrorId : NativeCommandError + PSComputerName : Server2"

【问题讨论】:

    标签: powershell variables remote-desktop


    【解决方案1】:

    如果不深入了解问题的具体细节,您似乎遇到了在脚本块内扩展外部变量的问题。

    如果是这样,则解决方案不是很漂亮。不久前我自己遇到了这个问题,解决方案是首先将您的脚本生成为字符串。这样,变量将被扩展。然后,您使用 ScriptBlock 静态方法 Create() 制作一个扩展您的内容的脚本块。

    此博客 - http://blogs.technet.com/b/heyscriptingguy/archive/2013/05/22/variable-substitution-in-a-powershell-script-block.aspx - 给出了解释,并举例说明:

    PS C:\> $a = "This is a string"
    PS C:\> $b = "The value of `$a is $a"
    PS C:\> $myScriptBlock = [ScriptBlock]::Create($b)
    

    【讨论】:

    • 虽然上面的答案给了我一个 chggon.exe 替代品,但我仍然会让我的脚本运行,因为它更像是一个学习练习。感谢您的信息。
    【解决方案2】:

    blog 了解如何用 powershell 替换 chggon.exe:

    # Query
    gwmi win32_terminalservicesetting -N "rootcimv2terminalservices" | %{
        if ($_.logons -eq 1){"Disabled"}
        else {
            switch ($_.sessionbrokerdrainmode)
            {
                0 {"Enabled"}
                1 {"DrainUntilRestart"}
                2 {"Drain"}
                default {"something’s not right here!"}
            }
        }
    }
    
    # Change logon /Enable
    $temp = (gwmi win32_terminalservicesetting -N "rootcimv2terminalservices")
    $temp.sessionbrokerdrainmode=0
    $temp.logons=0
    $temp.put()
    
    # Change Logon /Disable
    $temp = (gwmi win32_terminalservicesetting -N "rootcimv2terminalservices")
    $temp.logons=1
    $temp.put()
    
    # Change Logon /Drain
    $temp = (gwmi win32_terminalservicesetting -N "rootcimv2terminalservices")
    $temp.sessionbrokerdrainmode=2
    $temp.put()
    
    # Change Logon /DrainUntilRestart
    $temp = (gwmi win32_terminalservicesetting -N "rootcimv2terminalservices")
    $temp.sessionbrokerdrainmode=1
    $temp.put()
    

    将此与 gwmi 上的 -Computer 参数结合起来,您就可以替换 chggon 了。

    【讨论】:

    • 啊太棒了。我会用这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2020-12-01
    • 2012-02-06
    • 1970-01-01
    • 2011-03-19
    • 2012-11-17
    相关资源
    最近更新 更多