powershell - powershell 运行空间:访问全局变量 Yes 还是 no?
问题描述
我有我在本地系统上导入的这个模块。当我也在本地系统上使用运行空间运行脚本块时,该模块中的函数可以在运行空间脚本块中访问。
该模块创建全局变量。我测试了这些全局变量是否也可以从运行空间中运行的脚本块访问。它们都由 get-variable -scope global -name 返回但是当我尝试从脚本块访问这些全局时,只有一些通过。
如果所有人都不会出现,我可以处理这个问题,或者他们都会出现。但是它们都显示为在场,但只有一些作为有内容来投掷。
目标是让这个模块在运行空间中运行的本地系统和本地系统这两个上下文中工作。
解决方案
简而言之,您想在运行空间中看到的所有内容都应该传递给它。
如果您的值是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
推荐阅读
- homebrew - 使用 brew extract 安装以前版本的公式
- discord.js - Discord bot 检测消息中的自定义表情符号
- java - 带有过滤器链接的 ParallelStream
- python - 部署在 Elastic Beanstalk 上的 Python Flask 服务器出现 AWS 内部服务错误,日志显示 SECRET_KEY 从未设置?
- python - 使用 ijson 从特定键读取 json 数据
- node.js - 文档更新时的云功能触发
- python-3.x - route53 将域转移到另一个 aws 帐户
- sql - 如何从现有行重新分配金额
- c# - 从 MVVMCross ViewModel 调用 RG.Plugins.Popup
- c++ - 如何使子菜单在 C++ 中执行 onclick 功能