powershell - Powershell lambda 范围
问题描述
我正在尝试使用高阶函数来执行某个任务,但似乎范围没有按我的预期工作。代码如下:
function DoSomething($scriptBlock, $message) {
# if not only running a check, run the given code
if ($shouldRunCheck) {
return $scriptBlock.Invoke()
}
Write-Host $message -foreground cyan
# write $message to file
}
这似乎工作正常,但是当我调用它时,我似乎无法保存到脚本块之外的变量。
$myArray = @()
$myArray += 'test 1'
DoSomething {
write-host $myArray # test 1
$myArray += 'test 2'
write-host $myArray # test 2
}
write-host $myArray # test 1
$myArray += 'test 3'
write-host $myArray # test 1 test 3
本质上,我需要从回调函数中添加到数组变量中,但它似乎只是覆盖了变量,就好像变量是只读的一样?
解决方案
您对范围界定是正确的。
发生的情况是,在脚本块内,变量在执行$myArray
时被创建为类型 [String] 的新变量$myArray += 'test 2'
。这个新变量在函数之外不存在,所以原始变量根本$myArray
没有改变。
为此,您需要在 上使用作用域$myArray
并将其声明为$script:myArray = @('test 1')
可以在整个脚本中访问它。
然后在脚本块中使用 向它添加新值$script:myArray += 'test 2'
,例如:
function DoSomething($scriptBlock) {
return $scriptBlock.Invoke()
}
$script:myArray = @('test 1') # declared in script-scope
# while inside the main script, you can simply access it as $myArray
Write-Host "MainScript: $myArray" # --> test 1
$scriptBlock = {
Write-Host "ScriptBlock: $script:myArray" # --> test 1
$script:myArray += 'test 2'
Write-Host "ScriptBlock: $script:myArray" # --> test 1 test 2
}
DoSomething $scriptBlock
Write-Host "MainScript: $myArray" # --> test 1 test 2
$myArray += 'test 3'
Write-Host "MainScript: $myArray" # --> test 1 test 2 test 3
结果:
MainScript: test 1 ScriptBlock: test 1 ScriptBlock: test 1 test 2 MainScript: test 1 test 2 MainScript: test 1 test 2 test 3
推荐阅读
- xml - 在 SOAPUI [****..XML.xsd] 中加载 WSDL 时出错:FileNotFoundException
- javascript - 如何使用原始格式的 Javascript 获取 URL 参数
- python - 按月过滤 DataFrame
- python - 用python编写一个程序,它不包含输入字符串中的任何重复字符。示例:A 重复了一个
- solr - SOLR 7 DataImportHandler – 无法将数据放入多值字段(通过“加入”表)
- python - 类型错误:Sum 不允许不同(Django)
- python - 无法在本地调试 github 项目,但可以安装并作为程序运行,由于导入问题而出错
- c# - 单选按钮在我的 Windows 窗体应用程序中第一次单击时没有反应
- python - 如何计算 K 折交叉验证中所有折的分类报告中的平均值?
- electron - 为什么电子不创建文件?