2013-07-11 76 views
1

我試圖在使用invoke-command的遠程計算機上執行代碼。該方法的一部分包含ScriptBlock參數,並且我知道我沒有正確地做某件事。Powershell ScriptBlock不執行

首先我試圖創建腳本的方法,它是這樣的:

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:

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

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

echo $result 

文件2:

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

這是因爲Invoke-Command執行遠程計算機上腳本塊中的代碼。 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 

注:確保「@沒有縮進。它必須是在該行的開頭。

順便說一句,雖然這是沒有實際意義,什麼是語句後立即設置變量的意義呢?一旦你拋出一個錯誤,函數終止。$fileExist = false永遠不會在任何情況下執行。你可能想用寫入錯誤

+0

將在腳本塊是什麼樣的,如果我使用的UNC路徑? – BlackHatSamurai

+0

你會使用一個UNC路徑,如果你把你的腳本放在一個文件中,而不是'。\ file2.ps1',哪個是遠程計算機無法訪問的本地文件的相對路徑(它將在它自己的默認工作目錄中查找該文件),您將在計算機上創建共享,將腳本文件放在該文件中,然後使用看起來像'\\ yourcomputer \ share \ file2.ps1'的路徑。將代碼放入ScriptBlock中您試圖調用ValidatePath函數的代碼可能會更好,因爲代碼會傳遞給遠程計算機。這不適合發表評論,我會將其添加到答案中。 –

+0

太棒了!謝謝! – BlackHatSamurai