【问题标题】:How can Get-ChildItem be tested for no results (zero files)?如何测试 Get-ChildItem 是否没有结果(零文件)?
【发布时间】:2011-07-28 13:44:43
【问题描述】:

我被一个看似简单的问题难住了;很抱歉这里有任何愚蠢的东西。

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

$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
   } 
}

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

【问题讨论】:

    标签: powershell get-childitem


    【解决方案1】:

    尝试使用@(..) 包装。它总是创建一个数组:

    $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 {
      ..
    }
    

    【讨论】:

    • 这是古怪的 PowerShell 数组处理/解释的绝妙技巧。谢谢!
    • 更新了,因为我认为这是处理可能为 null 的数组的正确(且简单)方法,或者如果为 null,以下管道将失败。
    【解决方案2】:

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

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

    【讨论】:

    • +1 用于过滤器提示,但我简化了我的示例,过滤器似乎不适用于多个扩展名(*.bak 和 *.tran),包括方式:-(
    • 我不得不怀疑这个答案,因为 if ($Files=$null) 不会返回 true,但 if (!$Files) 会。
    • 抱歉,显然您可以测试if ($Files -eq $null)if (!$Files),但由于某种原因不能测试if ($Files = $null)
    【解决方案3】:

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

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

    【讨论】:

    • 你的意思是 if (!$Files) { /write no files here/ } ?
    • 工作得很好,比批准的答案更整洁。谢谢。
    • 感谢您的赞赏。
    【解决方案4】:

    也尝试测试 $files -eq $null。

    【讨论】:

      【解决方案5】:

      在 get-childitem 命令前指定 [bool] 类型将在找到任何内容时返回 True,如果没有找到则返回 false。这就是埃米利亚诺的回答正在做的事情,但没有否定的要求。您可以使用其中任何一种,但我更喜欢 [bool] 使用一些更复杂的条件语句,以便更容易理解。

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

      在 If 语句中使用

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 2020-09-28
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多