3

这是一个示例脚本,它尝试在服务器上创建远程会话,然后使用 WMI 获取服务器的 IIS 应用程序池列表,并列出它们的名称:

    function Test-Remoting
    {
        [CmdletBinding()]
        param
        (    
        )
        begin
        {
            Enter-PSSession TestServer
            $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
            $appPools | ForEach-Object {
                $appPool = $_;
                $appPool.Name
            }
            Exit-PSSession
        }    
    }

该函数包含在名为“Test-Remoting.ps1”的文件中。我打开 PowerShell,CD 到包含这个文件的目录,点源文件,然后调用函数:

PS C:\Users\moskie> . .\Test-Remoting.ps1
PS C:\Users\moskie> Test-Remoting

但是这个脚本的结果是我本地机器上的应用程序池列表,而不是TestServer。

或者,如果我在 PowerShell 提示符下手动运行以下行(与函数中的行相同),我得到远程服务器上的应用程序池列表:

PS C:\Users\moskie> Enter-PSSession TestServer
[TestServer]: PS C:\> $appPools = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsApplicationPool" -Authentication 6
[TestServer]: PS C:\> $appPools | ForEach-Object { $appPool = $_; $appPools.Name }
<a list of the names of the application pools on TestServer>
[TestServer]: PS C:\>

我认为有一个关于 PowerShell 远程处理和范围的概念我没有注意到。任何人都可以帮助解释这种行为吗?

4

1 回答 1

5

我相信 Enter/Exit-PSSession 意味着更多的交互使用。从 Enter-PSSession 帮助:

SYNOPSIS
    Starts an interactive session with a remote computer.

在脚本中,像这样使用 New-PSSession 和 Invoke-Command:

$session = New-PSSession server01
Invoke-Command -Session $session {hostname}
Remove-PSSession -Session $session

更新:要远程执行完整的脚本,请使用 Invoke-Command 上的 FilePath 参数:

icm server01 -FilePath C:\users\keith\myscript.ps1 -arg 1,2

这会将脚本复制到远程计算机 server01 并使用提供的参数在那里执行它。

于 2010-02-04T00:32:14.820 回答