2

私は次のコードを書きました:

cls
function GetFoo() { 
    function GetBar() {
        $bar = "bar"
        $bar
    }

    $foo = "foo"
    $bar = GetBar
    $foo
    $bar
}


$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost 
-ScriptBlock ${function:GetFoo}
Write-Host $result[0]
Write-Host $result[1]

GetBar動作しますが、内部で定義したくありませんGetFoo

このようなことはできますか?

cls
function GetBar() {
    $bar = "bar"
    $bar
}

function GetFoo() {     
    $foo = "foo"
    $bar = GetBar
    $foo
    $bar
}


$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost 
-ScriptBlock ${function:GetFoo; function:GetBar; call GetFoo}
Write-Host $result[0]
Write-Host $result[1]

基本的に、必要な関数を ScriptBlock に選択的に配置し、そのうちの 1 つを呼び出しています。この方法では、関数内で関数を定義する必要がなく、その ScriptBlock の一部になりたい関数を注入することで ScriptBlock を構築できます。

4

4 に答える 4

1

問題は、Invoke-Command内部のものしか見ることScriptBlockができず、外部で定義された関数を見ることができないことです。本当にやりたい場合は、次のようにすべてを 1 行で実行できます。

$result = Invoke-Command  -ComputerName localhost  -ScriptBlock { function GetBar() { $bar = "bar"; $bar }; function GetFoo() { $foo = "foo"; $bar = GetBar; $foo;  $bar }; GetFoo }

ただし、個人的には、関数をスクリプトに保存し、次のようInvoke-Command-FilePathパラメーターで呼び出すことをお勧めします。

$result = Invoke-Command  -ComputerName localhost  -FilePath "\1.ps1"
于 2012-10-29T09:00:23.263 に答える