将脚本的相对路径传递给PowerShell作业

时间:2016-08-27 21:44:25

标签: multithreading powershell powershell-v3.0 jobs

我在单独的文件中有函数,我需要在一个主文件中作为作业运行。

我需要能够传递这些函数参数。

现在我的问题是弄清楚如何以一种并非完全糟糕的方式将函数文件的路径传递给作业。

我需要在文件顶部定义函数以提高可读性(只需要一个静态注释,说明"脚本使用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 }

1 个答案:

答案 0 :(得分:0)

您可以简单地创建路径数组,然后从Start-Job传递-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"
}

你可以跳过所有带有名字的$ i迭代器,Powershell会自动命名作业,并且可以轻松预测:Job1,Job2 ..所以它会使代码变得更漂亮。