使用 start-job 作为后台作业启动功能

Start function as a background job with start-job

我正在尝试使用 start-job 启动一个函数。 出于某种原因,我无法让它工作,全局变量不会通过。 我的问题是 - 如何将全局变量传递给函数,而不是在不在函数内部声明它们的情况下传递给 start-job。 函数示例:

 $OutputDirectory=c:\test
 $zipfile="c:.zip"

    function 7zipextraction
{
    Set-Alias 7zip zip_path
    # Extracting files
    $extract = 7zip x -y $zipfile -o"$OutputDirectory"
    if ($LASTEXITCODE -ne 0)
    {
        
        write-host "7zip Error"
        
        return
    }
    else
    {
        write-host "Files extracted successfully"
    }
    Start-Sleep -s 2
    
}

开始工作的例子:

Start-Job -ScriptBlock ${Function:7zipextraction} | Wait-Job | Receive-Job

Start-Job 将作业分派给 一个单独的子进程 ,这就是它无法访问您在调用进程中定义的变量的原因。

参数化函数中的所有变量,然后将适当的参数显式传递给Start-Job -ArgumentList:

function 7zipextraction
{
    param(
        [string]$ZipFile,
        [string]$OutputDirectory,
        [string]zipPath
    )

    Set-Alias 7zip zipPath -Force

    # Extracting files
    $extract = 7zip x -y $zipfile -o"$OutputDirectory"
    if ($LASTEXITCODE -ne 0)
    {
        write-host "7zip Error"
        return
    }
    else
    {
        write-host "Files extracted successfully"
    }
    Start-Sleep -s 2
}

Start-Job -ScriptBlock ${Function:7zipextraction} -ArgumentList "c:.zip","c:\test","c:\path\tozipz.exe" | Wait-Job | Receive-Job

您可以使用 using: 修饰符来访问脚本块之外的变量:

$OutputDirectory='c:\test'
$zipfile='c:.zip'
zippath = 'C:\path\tozip'

function 7zipextraction
{
    Set-Alias 7zip $using:7zippath
    # Extracting files
    $extract = 7zip x -y $using:zipfile -o"${using:OutputDirectory}"
    if ($LASTEXITCODE -ne 0)
    {
        
        write-host "7zip Error"
        
        return
    }
    else
    {
        write-host "Files extracted successfully"
    }
    Start-Sleep -s 2
    
}

Start-Job -ScriptBlock ${Function:7zipextraction} | Receive-Job -Wait -AutoRemoveJob

using 适用于在远程计算机或不同线程中执行的脚本块:

  • 调用命令
  • 开始工作
  • 开始线程作业
  • ForEach-Object -Parallel