我对这似乎是一个简单的问题感到难过;很抱歉这里有任何骨头的问题。
我有清理已失效备份文件的脚本。在识别出我循环的文件并打印出被转储的内容之后。我的问题出现了尝试在零失效文件时提供反馈/测试。该脚本看起来像......
$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
没有结果的适当方法是什么?
答案 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"}