Powershell 使用空对象进入 foreach 循环

Powershell 使用空对象进入 foreach 循环

我列出了给定目录中的所有备份:

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

(无输出)

相关内容