我列出了给定目录中的所有备份:
$backups = Get-ChildItem -Path $zipFilepath |
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-7)) -and
(-not $_.PSIsContainer) -and ($_.Name -like "backup*")}
如果我将其设置为故意不返回任何文件(.addDays(-600)则以下内容将打印“Empty”(如预期的那样):
if (!$backups)
{
"Empty"
}
如果我尝试使用空的 $backups 变量列出名称:
foreach ($file in $backups)
{
$file.FullName;
}
如果我将其更改为以下内容,则不会得到任何结果(如预期的那样):
"test"+ $file.FullName;
然后我在“空”下得到一个“测试”。如果 $backups 为空,这怎么可能呢?
答案1
这是 Powershell 的一项“功能”。您的$backups
可能包含多种的 $null
值,以及非空值,因此 Powershell 必须迭代对象来处理foreach
。事实上,我们都将其视为$backup
单值标量($null
在本例中)并不重要,至少对 MS 来说... :)
看到这个Microsoft Connect 错误报告了解更多详细信息——它在 Powershell v3 中已“修复”。
在 v2 上:
PS H:\> foreach ( $i in $null ) { "Hi" }
Hi
在 v3 上:
PS H:\> foreach ( $i in $null ) { "Hi" }
(无输出)