请考虑以下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是一个对象shell。我理解cmdlet根据上下文采取不同的行为。但我不明白这是如何实现的,以及使用了什么机制。
具体来说: if 语句允许从gci返回的语法被用作布尔值的魔力是什么?如果我想在其他地方使用该机制(在if语句之外),我该怎么办?是否有某种“强制转换为布尔”运算符? E.g。
$rc = (Cast following to boolean)(gci -r -fi *.rar)
答案 0 :(得分: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
这背后的想法是使用类似的检查来验证对象是否正确初始化。
答案 1 :(得分: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