为什么我们执行$ NULL =“ FOO”时Powershell不会抛出错误?

问题描述

我试图了解常数$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 = ...中的>NUL1>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 输出是更为常见的用例。