【发布时间】:2020-02-07 16:08:21
【问题描述】:
我正在 Powershell 中构建一个自定义模块来分解一些代码。
在模块中的函数中,我使用变量。但是,如果调用者使用相同的变量名,它可能会干扰我的模块。
例如,这里有一个小模块(MyModule.psm1):
function Get-Foo{
param(
[int]$x,
[int]$y
)
try{
$result = $x/$y
} catch{
Write-Warning "Something get wrong"
}
if($result -ne 0){
Write-Host "x/y = $result"
}
}
Export-ModuleMember -Function "Get-Foo"
以及使用该模块的示例脚本:
Import-Module "$PSScriptRoot\MyModule\MyModule.psm1" -Force
$result = 3 # some other computation
Get-Foo -x 42 -Y 0
输出是:
x/y = 3
如您所见,调用者声明的变量名与我模块中的变量名冲突。
避免这种行为的最佳做法是什么?
作为一项要求,我必须假设模块的开发人员不会是主要的脚本开发人员。因此,模块的内部不应该是已知的(有点黑盒子)
【问题讨论】:
-
尽管作用域确实在这里发挥了作用,但一个问题是产生了终止错误。因此,
$result永远不会按预期设置。您当前位置的if声明从不考虑这种可能性。如果将if语句移到try {}块内,则不会出现主要症状。 -
@AdminOfThings,我假设如果
$result未设置,它将包含默认值(0 表示整数,或 null 表示更真实的场景) -
@SteveB,默认情况下在 PowerShell 中引用不存在的变量会计算为
$null(如果您有Set-StrictMode -Version 1或更高版本,则会触发语句终止错误)。由于$null -ne 0是$true,因此您的if语句块被输入。 -
我很感激,史蒂夫。
标签: powershell