将参数传递给作业初始化脚本

时间:2016-08-29 07:45:36

标签: powershell powershell-v5.0

我有多个工作,对于每个工作,我希望拥有相同的初始化脚本来设置一些东西。我想将一些参数传递给初始化脚本,但不幸的是,使用-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中传递的参数?

1 个答案:

答案 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)