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

如果我尝试用一​​个空的$ backupsvariables列出名字:

 foreach ($file in $backups) { $file.FullName; } 

我没有得到(如预期),如果我改变这个:

 "test"+ $file.FullName; 

那么我会在“Empty”下面得到一个“testing”。 如果$备份是空的,这怎么可能?

这是Powershell的一个“function”。 您的$backups可能包含多个 $null值和非null值,所以Powershell必须迭代对象来处理foreach 。 事实上,我们都看到$backup为单值标量( $null在这种情况下)无关紧要,至lessMS … 🙂

有关更多详细信息,请参阅此Microsoft Connect Bug报告 – 它在Powershell v3中“固定”。

在v2上:

 PS H:\> foreach ( $i in $null ) { "Hi" } Hi 

在v3上:

 PS H:\> foreach ( $i in $null ) { "Hi" } 

(没有输出)