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

Passing arguments to job initialization script

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

据我所知,无法将参数传递给初始化脚本。 Init 脚本被设计成可重用的脚本块来加载已知资源。如果某些东西不能被定义一次,那么它就是那个作业的脚本块所独有的,不属于 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"
    
  • 或者您可以在脚本中生成初始化脚本块,使其成为动态的:

    $ModulePath = "c:\mymodule.ps1"
    
    $init = @"
    
    #Import-Module "$ModulePath"
    #Something-Else
    
    "@
    
    $initsb = [scriptblock]::Create($init)