如何测试Get-ChildItem没有结果(零文件)?

时间:2011-07-28 13:44:43

标签: powershell get-childitem

我对这似乎是一个简单的问题感到难过;很抱歉这里有任何骨头的问题。

我有清理已失效备份文件的脚本。在识别出我循环的文件并打印出被转储的内容之后。我的问题出现了尝试在零失效文件时提供反馈/测试。该脚本看起来像......

$Files = Get-ChildItem $BackupPath_Root -include *.bak -recurse 
           | where {$_.CreationTime  -le $DelDate_Backup }  

if ( $Files -eq "" -or $Files.Count  -eq 0 ) {
    write-host "   no files to delete."    #<-- this doesn't print when no files
} else {
   foreach ($File in $Files) {
      write-host “$File” 
      Remove-Item $File | out-null
   } 
}

如果检查没有文件,则不会捕获无文件条件。测试$Files没有结果的适当方法是什么?

5 个答案:

答案 0 :(得分:48)

尝试换行@(..)。它始终创建一个数组:

$Files = @(Get-ChildItem $BackupPath_Root -include *.bak -recurse 
           | where {$_.CreationTime  -le $DelDate_Backup })
if ($Files.length -eq 0) {
  write-host "   no files to delete." 
} else {
  ..
}

答案 1 :(得分:13)

当没有文件时,$ Files等于$ null,因此EBGreen建议你应该测试$ null。此外,$ Files.Count仅在结果是文件集合时才有用。如果结果是标量(一个对象),则它将没有count属性,并且比较失败。

性能提示:当您只需要搜索一种扩展类型时,请使用-Filter参数(而不是-Include),因为它在提供者级别进行过滤。

答案 2 :(得分:7)

当扫描文件夹为空时,变量的计算结果为空值表达式。您可以使用:

if (!$Files) {
# ...
}

答案 3 :(得分:4)

尝试测试$ files -eq $ null。

答案 4 :(得分:0)

如果找到任何内容,则在get-childitem命令前指定[bool]类型将返回True,如果未找到任何内容,则返回false。这就是Emiliano的回答,但没有负面要求。你可以做任何工作,但我更喜欢[bool]和一些更复杂的条件语句,以便更容易理解。

[bool](Get-ChildItem C:\foo.txt)

用于If语句

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"}