PowerShell - cmdlet如何返回值?

Sab*_*ncu 3 powershell

请考虑以下PowerShell赋值语句:

$rc = (gci -r -fi *.rar)
Run Code Online (Sandbox Code Playgroud)

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

    Directory: C:\file tests

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/22/2012   7:09 PM    3699776 somefile.rar
Run Code Online (Sandbox Code Playgroud)

精细.现在考虑这个PowerShell if语句:

if (gci -r -fi *.rar)
{
    echo "Rar files found"
}
else 
{
    echo "No rar files"
}
Run Code Online (Sandbox Code Playgroud)

在if语句中,gci cmdlet的返回被视为布尔值.但是,在早期赋值语句的情况下,来自相同cmdlet的返回生成了字符串输出.

我知道PS是一个对象shell.我理解cmdlet根据上下文采取不同的行为.但我不明白这是如何实现的,以及使用了什么机制.

具体来说:if语句允许从gci返回被视为布尔值的魔力是什么?如果我想在其他地方使用该机制(在if语句之外),我该怎么办?是否有某种"强制转换为布尔"运算符?例如

$rc = (Cast following to boolean)(gci -r -fi *.rar)
Run Code Online (Sandbox Code Playgroud)

Kla*_*ark 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
Run Code Online (Sandbox Code Playgroud)

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

  • gci可以返回null或FileSystemInfo或File ofSystemInfo数组.所以这取决于你的文件夹内容.如果只有一个文件,则由于"对任何对象的引用"规则,它将成立.如果你得到一个数组,那将是真的,因为数组长度>规则.如果你得到null,由于Null规则,它将是假的. (2认同)
  • @Sabuncu - 没有从gci/dir返回的字符串.您只能在未捕获对象时(在变量中或通过管道传输到cmdlet)并最终作为输出发送到格式化程序以供​​视觉使用. (2认同)
  • @Sabuncu是的.任何不为null,不是0,不是$ false而不是空集合的东西都被视为$ true.一般来说这非常有用,并不仅仅是一个PowerShell的东西.Javascript也有"真实性"这个概念. (2认同)