3

请考虑以下 PowerShell 赋值语句:

$rc = (gci -r -fi *.rar)

如果目录结构中存在 rar 文件,则echo $?显示以下内容:

    Directory: C:\file tests

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/22/2012   7:09 PM    3699776 somefile.rar

美好的。现在考虑这个 PowerShell if 语句:

if (gci -r -fi *.rar)
{
    echo "Rar files found"
}
else 
{
    echo "No rar files"
}

在 if 语句中,来自 gci cmdlet 的返回被视为布尔值。但是在前面的赋值语句的情况下,相同 cmdlet 的返回会产生一个字符串输出。

我知道 PS 是一个对象外壳。我了解 cmdlet 的行为因上下文而异。但我不明白的是这是如何完成的,以及使用了什么机制。

具体来说:if语句使用的魔法是什么,它允许将 gci 的返回值视为布尔值?如果我想在其他地方(在 if 语句之外)使用该机制,我需要做什么?是否有某种“转换为布尔”运算符?例如

$rc = (Cast following to boolean)(gci -r -fi *.rar)
4

2 回答 2

8

这张表给你答案。

True                                         False
~~~~                                         ~~~~~
$TRUE                                        $FALSE
Any string of length > 0                     Empty string
Any number ≠ 0                               Any number = 0
Array of length > 1                          Array of length 0
Array of length 1 whose element is true      Array of length 1 whose element is false
A reference to any object  <<<<<             $NULL

这背后的想法是使用类似的检查来验证对象是否正确初始化。

于 2013-05-29T16:15:40.773 回答
1

我认为 Powershell 只是将 null 和零视为 false,如下所示:

PS > if(1) {"True"} else {"False"}
True
PS > if(0) {"True"} else {"False"}
False
PS > if($null) {"True"} else {"False"}
False

要转换,请使用以下格式:

PS > [Bool]"1"
True
于 2013-05-29T15:53:21.323 回答