2013-07-11 2 views
1

invoke-command을 사용하여 원격 컴퓨터에서 코드를 실행하려고합니다. 그 방법의 일부는 ScriptBlock 매개 변수를 포함하고 있으며, 내가 올바르게하고 있지 않다는 느낌을받습니다.Powershell ScriptBlock Not Execution

param([string] $filename) 

function ValidatePath($file, $fileType = "container") 
{ 
    $fileExist = $null 
    if(-not (test-path $file -PathType $fileType)) 
    {    
     throw "The path $file does not exist!" 
     $fileExist = false 
    } 
    else 
    { 
     echo $filename found! 
     $fileExist = true 
    } 
    return $fileExist 
} 


$responseObject = Invoke-Command -ComputerName MININT-OU9K10R 
    -ScriptBlock{validatePath($filename)} -AsJob 

$result = Receive-Job -id $responseObject.Id 

echo $result 

이 전화를 걸려면, 내가 .\myScriptName.ps1 -filename C:\file\to\test 할 것 :

는 우선이처럼 보였다 스크립트의 방법을 만들려고. 스크립트는 실행되지만 함수를 호출하지는 않습니다.

그런 다음이 함수를 새 스크립트에 넣어야한다고 생각했습니다.

파일 1 : 2

$responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock { 
    .\file2.ps1 -filename C:\something } -AsJob 

$result = Receive-Job -id $responseObject.Id 

echo $result 

파일 :이처럼 보였다 어느 기능을 실행합니다 이러한 방식의

Param([string] $filename) 

과 내가 왜 궁금하네요; 또는 그것이 작동하게하기 위해해야 ​​할 일. 호출-명령은 원격 컴퓨터에서 스크립트 블록의 코드를 실행하기 때문이다

function ValidatePath($file, $fileType = "container") 
{ 
    $fileExist = $null 
    if(-not (test-path $file -PathType $fileType)) 
    {    
     throw "The path $file does not exist!" 
     $fileExist = false 
    } 
    else 
    { 
     echo $filename found! 
     $fileExist = true 
    } 
    return $fileExist 
} 

답변

5

. ValidatePath 함수가 원격 컴퓨터에 정의되어 있지 않으며 스크립트 파일 file2.ps1이 해당 위치에 없습니다. 원격 컴퓨터가 Invoke-Command를 실행하는 스크립트의 코드 나 스크립트가 실행되는 컴퓨터의 파일에 액세스 할 수있는 권한은 없습니다. file2.ps1을 원격 컴퓨터에 복사하거나 파일을 사용할 수있는 컴퓨터의 공유에 UNC 경로를 제공하거나 ValidatePath 함수의 내용을 스크립트 블록에 넣어야합니다. 당신이 $ fileExist반환 문을 제거하는 것, 예를 들어, $ 파일 이름 또는 그 반대로 $ 파일의 모든 인스턴스를 변경하고 대화 형으로 실행하는 코드를 적용해야합니다.

당신이 뭔가를 할 거라고, 원격 컴퓨터에 전달 가져옵니다 스크립트 블록의 경로 확인하는 코드를 삽입하려면 :

$scriptblock = @" 
    if (-not (Test-Path $filename -PathType 'Container')) { 
    throw "The path $file does not exist!" 
    } else { 
    echo $filename found! 
    } 
"@ 

$responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock{$scriptblock} -AsJob 

N.B. 확인 @는 "들여 쓰기가 아닌지 확인합니다. 그것은 라인의 시작 부분에 있어야합니다. BTW

,이 이론에 불과하지만하는 던져 문 직후 변수를 설정하는 점은 무엇인가? 당신이 오류가 발생하면, 함수는 종료됩니다. $fileExist = false는 어떤 상황에서도 실행되지 않을 것입니다. 당신은 아마 쓰기 오류를 사용하고 싶었다.

+0

스크립트 블록 내가 UNC 경로를 사용하는 경우처럼 보일 것입니다 무엇? – BlackHatSamurai

+0

당신은 사용하십시오 스크립트를 파일에 넣으면 UNC 경로가되며,. \ file2.ps1 대신 원격 컴퓨터가 액세스 할 수없는 로컬 파일의 상대 경로 (자체 기본 작업 디렉토리에서 파일을 찾습니다), 컴퓨터에서 공유를 만들고 거기에 스크립트 파일을 넣은 다음 '\\ yourcomputer \ share \ file2.ps1'와 같은 경로를 사용하십시오.ValidatePath 함수를 호출하려는 ScriptBlock에 코드를 추가하는 것이 좋습니다. 코드가 원격 컴퓨터에 전달되기 때문입니다. 그것은 코멘트에 맞지 않을 것입니다, 나는 대답에 그것을 추가 할 것입니다. –

+0

좋습니다! 고맙습니다! – BlackHatSamurai

관련 문제