问题描述
我试图了解常数$TRUE
,$FALSE
和$NULL
在Powershell中的工作原理,以及如何分别测试它们或将它们与变量进行比较。
作为Powershell新手,我做了一些基本测试。尽管$TRUE
和$FALSE
的行为符合预期,但我对尝试为$NULL
分配另一个值时所看到的内容感到困惑:
PS C:\Users\Administrator> $NULL=1
PS C:\Users\Administrator> $NULL="FOO"
PS C:\Users\Administrator> $NULL
PS C:\Users\Administrator>
$NULL
应该是常量或只读,不是吗?那么,为什么我可以在不给Powershell抛出异常的情况下为其分配另一个值?为什么那个静默地忽略该分配?
相反,$FALSE
的行为符合预期:
PS C:\Users\Administrator> $FALSE=1
Cannot overwrite variable false because it is read-only or constant.
At line:1 char:1
+ $FALSE=1
+ ~~~~~~~~
+ CategoryInfo : WriteError: (false:String) [],SessionStateUnauthorizedAccessException
+ FullyQualifiedErrorId : VariableNotWritable
PS C:\Users\Administrator>
解决方法
您可以分配到$null
的主要原因-尽管作为空值的表示,它应该恒定 >(例如 other PowerShell automatic variables,例如$true
和$false
)-是它为启用了以下有用的习惯用法>输出抑制 :
# Discard the success output from a command.
$null = Get-Item -ErrorAction Stop foo.txt
也就是说,$null
的作用就像可以分配给您的常规读写变量,但是无论您分配给它什么(命令的成功输出,它来自流号{{ 1}}-请参见about_Redirection
)被悄然丢弃。
实际上, 1
等效于$null = ...
中的>NUL
(1>NUL
)和POSIX中的cmd.exe
(>/dev/null
)兼容的外壳,例如1>/dev/null
。
请注意,尽管bash
惯用语比Out-Null
[1] 快,并且在PowerShell中,您也可以使用... | Out-Null
或> $null
还发出意图放弃(成功)输出的意图(与$null = ...
不同)。 (也有> $null
,但它要求您将命令括在括号中。)有关更多信息,请参见this answer。
但是,如果您还想抑制 other 输出流(太),则确实需要重定向;例如,[void] (...)
丢弃所有流的输出。
对于检查变量的属性(包括自动变量),请使用Get-Variable
cmdlet,并在没有*> $null
符号的情况下将变量的名称传递给。 / em>;例如,$
检查null
。
$null
PS> Get-Variable null | Format-List
Value :
Description : References to the null variable always return the null value. Assignments have no effect.
Options : None
Name : null
Visibility : Public
Module :
ModuleName :
Attributes : {}
确保以列表形式列出变量对象(System.Management.Automation.PSVariable
实例或派生类的实例)的 all 所有属性。
诸如Format-List *
之类的常量变量会将$false
显示为Constant
属性值的一部分。
[1]注意:PowerShell [Core] v6 +进行了优化,如果丢弃表达式的值(例如{{1 }}与 command (例如Options
)相比,但是请注意,抑制 command 输出是更为常见的用例。