开发者

How can Get-ChildItem be tested for no results (zero files)?

I'm stumped here on what seems to be a simple problem; so sorry for any bone-headed-ness over here.

I have script that cleans up defunct backup files. After identifying the files I loop over and print out what's being dumped. My problem arises trying to provide feedback/testing when there are zero defunct files. The script looks like...

$Files = Get-ChildItem $BackupPath_Roo开发者_StackOverflow中文版t -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
   } 
}

The if checking for no files doesn't catch the no file condition. What is the appropriate way to test $Files for no results ?


Try wrapping in @(..). It creates always an array:

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


When there are no files, $Files is equal to $null, so as EBGreen suggests you should test against $null. Also, $Files.Count is only useful when the result is a collection of files. If the result is a scalar (one object) it won't have a count property and the comparison fails.

Performance tip: when you need to search for just one extension type, use the -Filter parameter (instead of -Include) as it's filtering on the provider level.


The variable evaluates to a null-valued expression when scanned folder is empty. You can use:

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


Try testing for $files -eq $null also.


Specifying the [bool] type in front of a get-childitem command will return True if anything is found, or false if nothing is found. This is what Emiliano's answer is doing, but without the negative requirement. You can make either work but I prefer [bool] with some of the more complex conditional statements just to make it easier to follow.

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

Used in an If statement

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜