- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个执行脚本 block 的函数。为方便起见,脚本 block 不需要显式定义参数,而是可以使用 $_
和 $A
引用输入。
在代码中,这样做是这样的:
$_ = $Value
$A = $Value2
& $ScriptBlock
function F {
param(
[ScriptBlock]$ScriptBlock,
[Object]$Value
[Object]$Value2
)
$_ = $Value
$A = $Value2
& $ScriptBlock
}
.ps1
) 中,但使用
Import-Module
导入,
F
的行为正如预期的那样:
PS> F -Value 7 -Value2 1 -ScriptBlock {$_ * 2 + $A}
15
PS>
.psm1
) 并使用
Import-Module
导入时,行为出乎意料:
PS> F -Value 7 -Value2 1 -ScriptBlock {$_ * 2 + $A}
PS>
{$_ + 1}
而是给出
1
.看来
$_
值为
$null
反而。据推测,某些安全措施限制了
$_
的范围。变量或以其他方式保护它。或者,可能是
$_
变量由一些自动过程分配。无论如何,只要
$_
变量受到影响,第一个不成功的示例将返回
1
.
Invoke-ScriptBlock -Variables @{"_" = $Value; "A" = $Value2} -InputObject $ScriptBlock
最佳答案
乱序:
- Is there some other way of solving this that does not involve including an explicit parameter declaration in the script block?
$_
, 使用
ForEach-Object
!
ForEach-Object
在调用者的本地范围内执行,这可以帮助您解决问题 - 除非您不必这样做,因为它还会自动将输入绑定(bind)到
$_
/
$PSItem
:
# this will work both in module-exported commands and standalone functions
function F {
param(
[ScriptBlock]$ScriptBlock,
[Object]$Value
)
ForEach-Object -InputObject $Value -Process $ScriptBlock
}
F
将按预期工作:
PS C:\> F -Value 7 -ScriptBlock {$_ * 2}
Ideally, the solution would involve the ability to explicitly specify the environment in which a script block is run. Something like:
Invoke-ScriptBlock -Variables @{"_" = $Value; "A" = $Value2} -InputObject $ScriptBlock
ScriptBlock.InvokeWithContext()
执行脚本 block :
$functionsToDefine = @{
'Do-Stuff' = {
param($a,$b)
Write-Host "$a - $b"
}
}
$variablesToDefine = @(
[PSVariable]::new("var1", "one")
[PSVariable]::new("var2", "two")
)
$argumentList = @()
{Do-Stuff -a $var1 -b two}.InvokeWithContext($functionsToDefine, $variablesToDefine, $argumentList)
function F
{
param(
[scriptblock]$ScriptBlock
[object]$Value
)
$ScriptBlock.InvokeWithContext(@{},@([PSVariable]::new('_',$Value)),@())
}
New-Module
定义的内存模块,但模块范围解析行为描述与从磁盘导入脚本模块时相同)
&
调用运算符,PowerShell 会将后续参数视为要在所述模块中调用的命令:
# Our non-module test function
$twoPlusTwo = { return $two + $two }
$two = 2
& $twoPlusTwo # yields 4
# let's try it with explicit module-scoped execution
$myEnv = New-Module {
$two = 2.5
}
& $myEnv $twoPlusTwo # Hell froze over, 2+2=5 (returns 5)
- Why can't script blocks in module files access variables defined in functions from which they were called?
- If they can, why can't the
$_
automatic variable?
$two = 2
function Test-IsOdd
{
param([int]$n)
return $n % $two -ne 0
}
Test-IsOdd
应该产生预期的结果:
PS C:\> Test-IsOdd 123
True
$two
在这种情况下,变量存在一个缺陷——如果在我们的脚本或 shell 中的某个地方,我们不小心重新分配了局部变量
$two
,我们可能会破坏
Test-IsOdd
完全地:
PS C:\> $two = 1 # oops!
PS C:\> Test-IsOdd 123
False
$oddModule = New-Module {
function Test-IsOdd
{
param([int]$n)
return $n % $two -ne 0
}
$two = 2
}
Test-IsOdd
,我们可以预见地得到预期的结果,而不管调用者范围内的“污染”如何:
PS C:\> Test-IsOdd 123
True
PS C:\> $two = 1
PS C:\> Test-IsOdd 123 # still works
True
关于powershell - 为什么变量的范围会根据它是 .ps1 还是 .psm1 文件而改变,如何缓解这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61979503/
尽管 Oracle 是最早创建存储过程 (PL/SQL) 然后是 Informix 和 (SPL) 的公司之一,但在 1998 年之后除了 DB2 之外哪些 RDBMS 产品已经实现了 SQL/PSM
我有以下代码: $x = 'xyz' & { $y = 'abc' foo } foo 函数定义在 foo.psm1 模块中,该模块在脚本 block 启动之前导入。 在 foo 函数
我尝试将 0 的 psm 与 pytesseract 一起使用,但出现错误。我的代码是: import pytesseract from PIL import Image img = Image.op
我一直在自学如何使用 BlueZ API 用 C 为 BLE 设备编写程序。但是,我似乎对 sockaddr_l2 结构的一个特定方面感到困惑。我使用的定义如下: struct sockaddr_l2
我在 wiki 上搜索过 SQL/PSM,我知道它代表结构化查询语言/持久存储模块。我想知道它到底是什么以及它与 T-SQL 和任何其他版本的 SQL 有何不同? 最佳答案 SQL-PSM 和 SQL
我正在尝试使用诺基亚 N9 (meego) 作为虚拟蓝牙鼠标/键盘。我正在尝试使用 this small program作为起点,但我遇到了问题:当我运行这个程序时,我收到一条错误消息,告诉我“绑定(
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
打开 Nuget 控制台我收到以下错误: The following error occurred while loading the extended type data file: Microso
我是一名优秀的程序员,十分优秀!