我经常使用在脚本范围中声明的变量来避免函数及其范围的问题。我正在声明这些变量:
New-Variable -Name test -Option AllScope -Value $null
...或者有时我会像这样切换现有的变量来全面使用它们:
$script:test = $test
当我想要清除它们时,我要么使用它:
Clear-Variable test -Scope Script
......或者我只是使用它:
$test = $null
有区别吗?我应该更喜欢什么?为什么?
答案 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。
请注意,变量赋值语法通过范围前缀提供了范围,但它仅限于global
,script
和local
(默认值):$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]