我有多个工作,对于每个工作,我希望拥有相同的初始化脚本来设置一些东西。我想将一些参数传递给初始化脚本,但不幸的是,使用-ArgumentList
传递的参数似乎只能在实际的作业脚本中访问。
这是一个示例,演示了只能在实际脚本中访问的参数:
function StartJob([ScriptBlock] $script, [string] $name, [ScriptBlock] $initialization_script = $null, $argument = $null)
{
Start-Job -ScriptBlock $script -Name $name -InitializationScript $initialization_script -ArgumentList $argument | Out-Null
}
[ScriptBlock] $initialization_script =
{
# The argument given to StartJob should be accessible here
param($test)
echo "Test: $test"
}
[ScriptBlock] $actual_script =
{
param($test)
echo "Test: $test"
}
StartJob $actual_script "Test job" $initialization_script "Have this string in the `$initialization_script"
@(Get-Job).ForEach({
# Wait for the job to finish, remove it and output its results
Write-Host "$($_.Name) results:"
Receive-Job -Job $_ -Wait -AutoRemoveJob | Write-Host
})
我如何能够访问$initialization_script
中传递的参数?
答案 0 :(得分:0)
AFAIK无法将参数传递给初始化脚本。 Init脚本旨在成为可重用的脚本块,以加载已知资源。如果某些内容无法定义,那么它对该作业的scriptblock是唯一的,并且不属于init。脚本。你有几个选择:
如果您有一个模块(.psm1
,可能还有.psd1
),请将其放在其中一个模块文件夹中(有关路径,请参阅$env:PSModulePath
),这样您就可以只需在初始化脚本中编写Import-Module MyImportantModule
。
如果你不能使用上面的解决方案,我会在实际脚本中添加一个参数,并将路径作为常规参数传递。
[ScriptBlock] $actual_script =
{
# The argument given to StartJob should be accessible here
param($test, $ModulePath)
#Import-Module $ModulePath
echo "Test: $test"
}
Start-Job -ScriptBlock $actual_script -Name "Test job" -ArgumentList "First argument", "c:\mymodule.ps1"
或者您可以在脚本中生成初始化scriptblock,使其成为动态:
$ModulePath = "c:\mymodule.ps1"
$init = @"
#Import-Module "$ModulePath"
#Something-Else
"@
$initsb = [scriptblock]::Create($init)