Clear-Variable和设置变量之间的差异为NULL

时间:2016-06-01 11:59:26

标签: powershell variables scopes

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

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

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

$script:test = $test

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

Clear-Variable test -Scope Script

......或者我只是使用它:

$test = $null

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

2 个答案:

答案 0 :(得分:9)

来自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

答案 1 :(得分:3)

补充Marcanpilami's helpful answer

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

除非<{em> $test定义为Set-Variable -Option AllScope

  • Clear-Variable test -Scope Script

  • $test = $null

通常不等同于

使用 Set-Variable -Option AllScope,但-Scope参数变得无关紧要,因为只有一个变量实例存在(概念上) ),涵盖所有范围。)

$test = $null - 除非在最初创建变量test的情况下执行,否则将隐式创建 a test 当前范围内的变量(并为其指定$null),并保持原始变量不变。 有关PS中变量作用域的更多信息,请参阅我的this answer

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

还有private范围:local的变体,阻止后代范围看到变量 - 再次参见this answer。< / SUP>

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

但是,使用 Clear-Variable可以执行$<scope>:testing = ...的两件事:

  • -Scope参数还接受数字值,该值表示当前范围相对范围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]