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>]
。
除非 $test
用Set-Variable -Option AllScope
定义,
Clear-Variable test -Scope Script
和
$test = $null
通常不等价。
(与 Set-Variable -Option AllScope
他们是,但是-Scope
参数变得无关紧要,因为那时只有 一个 变量的实例存在(概念上),在所有范围。)
$test = $null
- 除非在与最初创建变量 test
时在同一范围内执行 - 将在 中隐式创建 test
变量当前 范围(并将$null
分配给它),并保持original 变量不变。 有关 PS 中变量作用域的更多信息,请参阅我的 this answer。
请注意,变量赋值语法也提供范围,通过 范围前缀,但仅限于 global
、script
和 local
(默认):$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 参数的数量?
.nuspec 文件中的 Azure DevOps 管道变量