code

인수가 있는 함수에서 Invoke-Command-ScriptBlock 사용

starcafe 2023. 8. 26. 12:01
반응형

인수가 있는 함수에서 Invoke-Command-ScriptBlock 사용

원격 호스트에서 Invoke-Command와 해당 명령을 사용하여 명령을 실행하는 PowerShell 스크립트를 작성하고 있습니다.-ScriptBlock매개 변수예를들면,

function Foo {
    ...
    return "foo"
}
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo}

이것은 잘 작동합니다.제가 지금 하고 싶은 것은 같은 것이지만, 로컬 인수가 있는 함수를 호출합니다.예를들면,

function Bar {
    param( [String] $a, [Int] $b )
    ...
    return "foo"
}
[String] $x = "abc"
[Int] $y = 123
$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock ${function:Foo($x,$y)}

하지만 이것은 작동하지 않습니다.

Invoke-Command : 'ScriptBlock' 매개 변수에 대한 인수의 유효성을 검사할 수 없습니다.인수가 null입니다.null이 아닌 인수를 제공하고 명령을 다시 시도하십시오.

Invoke-Command를 사용하여-ScriptBlock그것이 인수가 있는 로컬 함수입니까?

저는 제가 전체 함수와 매개변수를 큰 코드 블록으로 감쌀 수 있다는 것을 알고 있지만, 제 생각에 그것은 깨끗한 방법이 아닙니다.

당신은 원하는 것 같아요:

function Foo ( $a,$b) {
    $a
    $b
    return "foo"
}

$x = "abc"
$y= 123

Invoke-Command -Credential $c -ComputerName $fqdn -ScriptBlock ${function:Foo} -ArgumentList $x,$y

블록으로 함수를 래핑하고 블록을 통과할 수 있습니다.

$a = {
  function foo{}
  foo($args)
}

$a.invoke() // Locally

$rv = Invoke-Command --Credential $c --ComputerName $fqdn -ScriptBlock $a //remotely

우아하지는 않지만요.

이 기능은 다음과 같습니다.

function foo
{
    param([string]$hosts, [string]$commands)
    $scriptblock = $executioncontext.invokecommand.NewScriptBlock($commands)
    $hosts.split(",") |% { Invoke-Command -Credential $cred -ComputerName $_.trim() -Scriptblock $scriptblock }
}
$Log = "PowerShellCore/Operational"

Invoke-Command -ComputerName Server01 -ScriptBlock {Get-WinEvent -LogName $Using:Log -MaxEvents 10}\

언급URL : https://stackoverflow.com/questions/8448808/using-invoke-command-scriptblock-on-a-function-with-arguments

반응형