【问题标题】:PowerShell - How does a cmdlet return value?PowerShell - cmdlet 如何返回值?
【发布时间】:2013-06-02 22:40:40
【问题描述】:

请考虑以下 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)

【问题讨论】:

  • 它没有返回布尔值,而是返回它是 $null 或不是 $null
  • 即。 $(gci -r -fi *.rar) -eq $null
  • @jbockle:升级你的 cmets,谢谢。包围gci -r -fi *.rar$(...) 有什么作用?我试过没有美元符号,它仍然有效。 IE。 (gci -r -fi *.rar) -eq $null
  • 这只是变量扩展,但我只是出于习惯添加了 $

标签: powershell


【解决方案1】:

这张表给你答案。

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

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

【讨论】:

  • gci 可以返回 null 或 FileSystemInfo 或 FileSystemInfo 数组。所以这取决于你的文件夹内容。如果只有一个文件,由于“对任何对象的引用”规则,这将是正确的。如果你得到一个数组,由于长度数组>规则,它会是真的。如果你得到 null,由于 Null 规则,它将是错误的。
  • 不确定我是否同意字符串“false”。if('false'){'false is true!'}
  • @MikeShepard 不要将英语与 powershell 语言混淆。这样的脚本应该如何在法语语言环境中运行?它应该对“vrai”做同样的事情吗?字符串中没有关键字,只有字符串。
  • @Sabuncu - gci/dir 没有返回字符串。您只会看到当对象未被捕获(在变量中或通过管道传输到 cmdlet)并最终作为输出发送到格式化程序以供​​视觉使用时。
  • @Sabuncu 是的。任何非 null、非 0、非 $false 且非空集合的内容都被视为 $true。一般来说,这非常有用,而不仅仅是一个 powershell 的东西。 Javascript 也有这个“真实性”的概念。
【解决方案2】:

我认为 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

【讨论】:

  • +1 谢谢。此外,将 null 字符串转换为 bool 会产生 False;即[Bool]"" 是假的。
猜你喜欢
  • 2021-10-29
  • 2023-03-16
  • 2016-05-20
  • 2020-04-27
  • 2019-05-23
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多