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

EBa*_*arr 28 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
   } 
}
Run Code Online (Sandbox Code Playgroud)

if检查没有文件没有捕获无文件条件.测试$Files没有结果的适当方法是什么?

ste*_*tej 49

尝试包装@(..).它始终创建一个数组:

$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 {
  ..
}
Run Code Online (Sandbox Code Playgroud)

  • 对于古怪的 PowerShell 数组处理/解释来说,这是一个很棒的技巧。谢谢! (2认同)

Sha*_*evy 13

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

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


Emi*_*ggi 8

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

if (!$Files) {
# ...
}
Run Code Online (Sandbox Code Playgroud)