2016-08-27 34 views
0

我在單獨的文件中有功能,我需要在一個主文件中作爲作業運行。將腳本的相對路徑傳遞給PowerShell作業

我需要能夠傳遞這些函數參數。

現在我的問題是弄清楚如何將函數文件的路徑以不完全可怕的方式傳遞給作業。

我需要在提高可讀性文件的頂部定義的函數(只是有一個靜態的評論,說「腳本使用somefunc.ps1」是不夠的)

我還需要參考腳本相對路徑(它們將全部在相同的文件夾中)。

現在我正在使用env:來存儲腳本的路徑,但是這樣做我需要在5個地方參考腳本!

這是我有:

testJobsMain.ps1:

#Store path of functions in env so jobs can find them 
$env:func1 = "$PSScriptRoot\func1.ps1" 
$env:func2 = "$PSScriptRoot\func2.ps1" 

$arrOutput = @() 
$Jobs = @() 
foreach($i in ('aaa','bbb','ccc')) { 

    $Import = {. $env:func1} 
    $Execute = {func1 -myArg $Using:i} 

    $Jobs += Start-Job -InitializationScript $Import -ScriptBlock $Execute 
} 

$JobsOutput = $Jobs | Wait-Job | Receive-Job 
$JobsOutput 

$Jobs | Remove-Job 
#Clean up env 
Remove-Item env:\func1 
$arrOutput 

func1.ps1

function func1($myArg) { write-output $myArg } 

func2.ps1

function func2($blah) { write-output $blah } 

回答

0

你可以簡單地使陣列的路徑,然後通過路徑一個/所有的人都在-ArgumentList PARAM從啓動工作:

#func1.ps1 
function add($inp) { 
    return $inp + 1 
} 

#func2.ps1 
function add($inp) { 
    return $inp + 2 
} 

$paths = "$PSScriptRoot\func1.ps1", "$PSScriptRoot\func2.ps1" 

$i = 0 
ForEach($singlePath in $paths) { 
    $Execute = { 
     Param(
      [Parameter(Mandatory=$True, Position=1)] 
      [String]$path 
     ) 
     Import-Module $path 
     return add 1 
    } 
    Start-Job -Name "Job$i" -ScriptBlock $Execute -ArgumentList $singlePath 
    $i++ 
} 

for ($i = 0; $i -lt 2; $i++) { 
    Wait-Job "Job$i" 
    [int]$result = Receive-Job "Job$i" 
} 

你可以跳過所有這些$我用迭代器名稱,PowerShell的將自動命名工作,伊斯利可以預見的:作業1,作業2 ..所以它會使代碼更漂亮。

相關問題