2016-08-27 36 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 ..所以它会使代码更漂亮。

相关问题