1

我试图了解常量如何在 Powershell 中工作$TRUE$FALSE以及$NULL我应该如何分别测试它们或将它们与变量进行比较。

作为一个 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> 
4

1 回答 1

3

您可以分配它的主要原因$null- 即使作为空值的表示形式,它应该是常量(例如其他PowerShell自动变量,例如$trueand $falseare) - 是它启用了以下有用的输出抑制习惯用法:

# Discard the success output from a command.
$null = Get-Item -ErrorAction Stop foo.txt

也就是说,$null它可以像您可以分配给的常规读写变量一样起作用,但是您分配给它的任何内容(命令的成功输出,来自流编号1- 参见about_Redirection)都会被悄悄丢弃。

实际上,等效$null = ...于POSIX兼容shell >NUL1>NULcmd.exe>/dev/null1>/dev/null例如bash.

请注意,在 PowerShell 中,您可以选择使用... | Out-Nullor > $null,尽管该$null = ...习惯用法比[1]更快,并且还表示有意丢弃(成功)输出(与 不同)。(还有,但它要求您将命令括在括号中。)有关更多信息,请参阅此答案Out-Null> $null[void] (...)

但是,如果您还想抑制其他输出流(也),您确实需要重定向;例如,
*> $null丢弃所有流的输出。


至于检查变量的属性,包括自动属性,请使用Get-Variablecmdlet 并将变量的名称传递给它,而不需要$sigil;例如,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  : {}

Format-List *确保以列表形式列出变量对象(实例或派生类的实例)的所有属性。System.Management.Automation.PSVariable

一个常量变量,例如$false将显示ConstantOptions属性值的一部分。


[1] 注意:PowerShell [Core] v6+ 有一个优化,如果你丢弃一个表达式的值(例如,与一个命令的(例如, )相比,它可以Out-Null提供最快的解决方案,但请注意,抑制命令输出要多得多常见用例。1..1e6 | Out-NullWrite-Output (1..1e6) | Out-Null

于 2020-09-10T18:25:35.217 回答