当列出的对象不存在时,使用通配符没有错误

时间:2015-06-01 13:26:06

标签: powershell powershell-v4.0

执行此命令时:get-process -name nosuchprocess,我得到错误Cannot find a process with the name "nosuchprocess",这很好。

但在此之后:get-process -name nosuchprocess*,没有错误,没有输出 - 只是空提示。

使用其他命令(get-itemget-childitemselect-string)可以观察到相同的行为。

这背后有什么想法?在这两种情况下都没有找到对象,为什么输出不同?

1 个答案:

答案 0 :(得分:2)

这只是惯例。

假设您知道对象的实际名称并且您正试图获取您期望它的对象已经存在。您将获得的预期结果数为1.因此,您要么得到1还是得到错误。如果您不确定它是否存在,可以使用Test-Path或使用Get-ChildItem [...] -ErrorAction SilentlyContinue

如果您正在使用通配符,则假定您获得的是一组对象或一个您不确定其名称的对象。您甚至可能正在寻找不存在的对象,例如gci *.txt。因此,获得0,1或许多对象通常是完全合乎逻辑的。如果您需要测试以查看是否有结果,可以使用Count属性,例如:

$x = Get-ChildItem *.txt;
if ($x.Count -gt 0) { [...] }

尽管如此,请注意在旧版本的PowerShell(v1,v2)中,即使使用$x = @(Get-ChildItem *.txt);找到0或1个结果,也必须强制结果为数组。