当列出的对象不存在时使用通配符没有错误
No error using wildcards when listed object does not exist
执行此命令时:get-process -name nosuchprocess
,出现错误 Cannot find a process with the name "nosuchprocess"
,没关系。
但是在这个 get-process -name nosuchprocess*
之后,没有错误,没有输出 - 只是空提示。
使用其他命令(get-item
、get-childitem
、select-string
)可以观察到相同的行为。
这背后的想法是什么?在这两种情况下都没有找到对象,为什么输出不同?
这只是惯例。
假定如果您知道一个对象的实际名称并且您正在尝试获取您期望它已经存在的对象。您将获得的预期结果数是 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 个结果,您也必须将结果强制为数组。
执行此命令时:get-process -name nosuchprocess
,出现错误 Cannot find a process with the name "nosuchprocess"
,没关系。
但是在这个 get-process -name nosuchprocess*
之后,没有错误,没有输出 - 只是空提示。
使用其他命令(get-item
、get-childitem
、select-string
)可以观察到相同的行为。
这背后的想法是什么?在这两种情况下都没有找到对象,为什么输出不同?
这只是惯例。
假定如果您知道一个对象的实际名称并且您正在尝试获取您期望它已经存在的对象。您将获得的预期结果数是 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);
.