将脚本的相对路径传递给 powershell 作业
Passing relative paths of scripts to powershell jobs
我在单独的文件中有函数,我需要 运行 作为一个主文件中的作业。
我需要能够传递这些函数参数。
现在我的问题是弄清楚如何以一种不完全糟糕的方式将函数文件的路径传递给作业。
为了可读性,我需要在文件顶部定义函数(仅仅有一个静态注释 "script uses 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 }
您可以简单地制作路径数组,然后在 Start-Job 的 -ArgumentList
参数中传递其中 paths/all 之一:
#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..所以它会使代码更漂亮。
我在单独的文件中有函数,我需要 运行 作为一个主文件中的作业。
我需要能够传递这些函数参数。
现在我的问题是弄清楚如何以一种不完全糟糕的方式将函数文件的路径传递给作业。
为了可读性,我需要在文件顶部定义函数(仅仅有一个静态注释 "script uses 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 }
您可以简单地制作路径数组,然后在 Start-Job 的 -ArgumentList
参数中传递其中 paths/all 之一:
#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..所以它会使代码更漂亮。