首页 > 解决方案 > powershell 运行空间:访问全局变量 Yes 还是 no?

问题描述

我有我在本地系统上导入的这个模块。当我也在本地系统上使用运行空间运行脚本块时,该模块中的函数可以在运行空间脚本块中访问。

该模块创建全局变量。我测试了这些全局变量是否也可以从运行空间中运行的脚本块访问。它们都由 get-variable -scope global -name 返回但是当我尝试从脚本块访问这些全局时,只有一些通过。

如果所有人都不会出现,我可以处理这个问题,或者他们都会出现。但是它们都显示为在场,但只有一些作为有内容来投掷。

目标是让这个模块在运行空间中运行的本地系统和本地系统这两个上下文中工作。

标签: powershellrunspace

解决方案


简而言之,您想在运行空间中看到的所有内容都应该传递给它。

如果您的值是ValueType,则应通过引用显式传递它们。否则,您应该按原样传递它们(通过引用是崇敬类型的默认值)。

PoshRSJob这是我使用模块和自定义并行处理有限项目列表的模板SomeFunction

Function SomeFunction
{
    Param(
       [String]$SampleParam
    )
    return $SampleParam.ToUpper()
}

$JobScript = [scriptblock]{
    $inQueue = [System.Collections.Concurrent.ConcurrentQueue[string]]$args[0]
    $outBag = [System.Collections.Concurrent.ConcurrentBag[string]]$args[1]
    $currentItem = $null
    while($inQueue.TryDequeue([ref] $currentItem) -eq $true)
    {
        try
        {
            # Add result to OutBag
            $result = SomeFunction -SampleParam $currentItem -EA Stop
            $outBag.Add( $result )
        }
        catch
        {
            # Catch error
            Write-Output $_.Exception.ToString()
        }
    }
}

$inData = [System.Collections.Concurrent.ConcurrentQueue[string]]::new(
    [String[]](@(1..10000) | % { return [guid]::NewGuid().ToString() }) # Sample strings in lower case
    )

$resultData = [System.Collections.Concurrent.ConcurrentBag[string]]::new()

# Wait for queue to empty
$i_cur = $inData.Count
$i_max = $i_cur

# Start jobs
$jobs = @(1..20) | % { Start-RSJob -ScriptBlock $JobScript -ArgumentList @($inData, $resultData) -FunctionsToImport @('SomeFunction') }

# Wait queue to empty
while($i_cur -gt 0)
{
    Write-Progress -Activity 'Doing job' -Status "$($i_cur) left of $($i_max)" -PercentComplete (100 - ($i_cur / $i_max * 100)) 
    Start-Sleep -Seconds 3 # Update frequency
    $i_cur = $inData.Count
}

# Wait jobs to complete
$logs = $jobs | % { Wait-RSJob -Job $_ } | % { Receive-RSJob -Job $_  } 
$jobs | % { Remove-RSJob -Job $_ }
$Global:resultData = $resultData
$Global:logs = $logs

推荐阅读