Clear-Variable 和将变量设置为 NULL 之间的区别

Posted

技术标签:

【中文标题】Clear-Variable 和将变量设置为 NULL 之间的区别【英文标题】:Difference between Clear-Variable and setting variable to NULL 【发布时间】:2016-09-30 18:49:06 【问题描述】:

我经常使用在脚本范围内声明的变量来避免函数及其范围出现问题。我像这样声明这些变量:

New-Variable -Name test -Option AllScope -Value $null

...或者有时我像这样切换现有变量以全面使用它们:

$script:test = $test

当我想清除它们时,我要么使用它:

Clear-Variable test -Scope Script

...或者我只是使用这个:

$test = $null

有区别吗?我应该更喜欢什么,为什么?

【问题讨论】:

【参考方案1】:

从get-Help:

Clear-Variable cmdlet 删除存储在变量中的数据,但不会删除该变量。因此, 变量的值为 NULL(空)。如果变量具有指定的数据或对象类型,Clear-Variable 保留存储在变量中的对象的类型。

所以Clear-Variable$var=$null 几乎是等价的(除了保留的类型)。一个完全等价的方法是 $var=[mytype]$null

你可以自己测试一下:

$p = "rrrr"
Test-Path variable:/p     # => $true
$p = $null
Get-Member -InputObject $p     # => error
$p = [string]$null
Get-Member -InputObject $p   # => it is a string

然后回答下一个问题:如何完全删除变量(因为不存在的变量与空值变量不同)?简单的做

rm variable:/p
Test-Path variable:/p => $false

【讨论】:

++,但为了对称性和指定目标范围的能力,您应该提及Remove-Variable Clear-Variable 和分配 $null 都保留了类型绑定变量的类型(使用“转换表示法”定义的变量;例如,[int] $i = 1)。 这个答案不正确。分配给$null 也会保留强类型变量的类型信息;它可能仅仅因为范围而显得不同。见mklement0's answer。 这是如何被选为接受的答案的?它甚至没有给出Clear-Variable任何个例子。【参考方案2】:

补充Marcanpilami's helpful answer:

注意:要完全删除(取消定义)一个变量,请使用Remove-Variable <name> [-Scope <scope>]

除非 $testSet-Variable -Option AllScope 定义,

Clear-Variable test -Scope Script

$test = $null

通常不等价

( Set-Variable -Option AllScope 他们是,但是-Scope 参数变得无关紧要,因为那时只有 一个 变量的实例存在(概念上),在所有范围。)

$test = $null - 除非在与最初创建变量 test 时在同一范围内执行 - 将在 中隐式创建 test 变量当前 范围(并将$null 分配给它),并保持original 变量不变。 有关 PS 中变量作用域的更多信息,请参阅我的 this answer。

请注意,变量赋值语法也提供范围,通过 范围前缀,但仅限于 globalscriptlocal(默认):$global:test = $null$script:test = $null$local:test = $null

还有private 作用域:local 的变体,可防止后代作用域看到变量 - 再次,请参阅this answer。

如果您确保定位到相同的范围,那么上述两种形式在功能上是等效的:它们将$null 分配给目标变量.[1]

但是,使用 Clear-Variable 可以让您做两件事 $<scope>:testing = ... 没有

-Scope 参数 还接受一个 numeric 值,该值指示 范围 相对 到当前范围:0 是当前作用域,1 是父作用域,以此类推。

您可以定位多个变量(作为名称的数组或使用通配符


[1] 陷阱

请注意,如果目标变量是类型受限的(使用“强制转换表示法”分配;例如,[int] $i = 1),则类型是保留的 - 无论是使用$testing = $null 还是Clear-Variable - 都可能发生隐式类型转换,这可能会产生意外结果或失败

[int] $i = 1 # type-constrain $i as an integer
Clear-Variable i # equivalent of $i = $null
$i # !! $i is now 0 (!), because [int] $null yields 0

[datetime] $d = 1 # type-constrain $d as DateTime
Clear-Variable d # !! FAILS, because `$d = $null` fails, given that 
                 # !! $null cannot be converted to [datetime]

【讨论】:

以上是关于Clear-Variable 和将变量设置为 NULL 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中为 libSVM 的 nu-SVM 使用变量而不是 nu 参数的数量?

.nu​​spec 文件中的 Azure DevOps 管道变量

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

jQuery对象的javascript变量

QTP自带订票实现循环执行,參数化和将异常提示信息输出

使用 memwatch-node 识别闭包的内存泄漏