3

サーバーからPowershellを実行している約50のクライアントにいくつかのコマンドを送信しようとしています。ほとんどのコマンドは、Invoke-Commandを使用して機能します。他のコマンドとまったく同じ形式を使用しましたが、これは機能しません。基本的に、各クライアントにサーバーから.xmlファイルをフェッチさせて、後でインポートするようにします。ここのコードサンプルから$credentialsやその他の変数が欠落していますが、スクリプトの別の場所で正しく設定されています。

権限に関しては、winrmのTrustedHostsは*に設定され、スクリプトの実行は無制限に設定されます。

        clear
    $temp = RetrieveStatus

    $results = $temp.up  #Contains pinged hosts that successfully replied.

    $profileName = Read-Host "Enter the profile name(XML file must be present in c:\share\profiles\)"
    $File = "c:\profiles\profile.xml"
    $webclient = New-Object System.Net.WebClient
    $webclient.Proxy = $NULL
    $ftp = "ftp://anonymous:anonymous@192.168.2.200/profiles/$profileName"
    $uri = New-Object System.Uri($ftp)
    $command = {write-host (hostname) $webclient.DownloadFile($uri, $File)}

    foreach($result in $results)
        {           
    # download profile from C:\share\profiles
    Invoke-Command $result.address -ScriptBlock $command -Credential $credentials
    # add profile to wireless networks
    # Invoke-Command $result.address -ScriptBlock {write-host (hostname) (netsh wlan add profile filename="c:\profiles\$args[0].xml")} -argumentlist $profileName -Credential $credentials
        }

次のエラーが発生します。

You cannot call a method on a null-valued expression.
+ CategoryInfo          : InvalidOperation: (DownloadFile:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

何か案が?ローカルで実行すると、同じコマンドがクライアントで問題なく機能します。

4

1 に答える 1

3

反対側で定義されない$webclientスクリプトブロック内で使用します。$webclientスクリプトブロックでWebクライアントを作成してみませんか。例:

$command = {
    param($profileName)
    $File = "c:\profiles\profile.xml"
    $webclient = New-Object System.Net.WebClient
    $webclient.Proxy = $NULL
    $ftp = "ftp://anonymous:anonymous@192.168.2.200/profiles/$profileName"
    $uri = New-Object System.Uri($ftp)
    Write-Host (hostname)
    $webclient.DownloadFile($uri, $File)}
}

$profileName = Read-Host "Enter the profile name(XML file must be present in c:\share\profiles\)"

Invoke-Command $result.address -ScriptBlock $command -Credential $credentials -Arg $profileName

-ArgumentListこれには、のパラメータを介してクライアントからリモートマシンにいくつかの変数を提供する必要がありますInvoke-Command。これらの提供された引数はparam()、スクリプトブロック内のステートメントにマップされます。

于 2012-10-18T16:55:50.400 に答える