在PowerShell中使用foreach之前,有没有更好的方法来检查集合是否为空?

时间:2012-12-07 17:56:56

标签: powershell foreach powershell-v2.0

我有一个部署 PowerShell 2.0 脚本的部分,可以将潜在的robots.dev.txt复制到robots.txt,如果它不存在则不执行任何操作。

我原来的代码是:

$RobotFilesToOverWrite= Get-ChildItem -Path $tempExtractionDirectory -Recurse -Include "robots.$Environment.txt"
    foreach($file in $RobotFilesToOverWrite)
    {
        $origin=$file
        $destination=$file -replace ".$Environment.","."

        #Copy-Item $origin $destination
    }

但是,与C#有所不同,即使$ RobotFilesToOverWrite为null,代码也会在foreach中输入。

所以我必须用:

包围一切
if($RobotFilesToOverWrite)
{
    ...
}

这是最终代码:

$RobotFilesToOverWrite= Get-ChildItem -Path $tempExtractionDirectory -Recurse -Include "robots.$Environment.txt"
if($RobotFilesToOverWrite)
{
    foreach($file in $RobotFilesToOverWrite)
    {
        $origin=$file
        $destination=$file -replace ".$Environment.","."

        #Copy-Item $origin $destination
    }
}

我想知道是否有更好的方法来实现这一目标?

编辑:此问题似乎已在PowerShell 3.0中修复

2 个答案:

答案 0 :(得分:8)

# one way is using @(), it ensures an array always, i.e. empty instead of null
$RobotFilesToOverWrite = @(Get-ChildItem -Path $tempExtractionDirectory -Recurse -Include "robots.$Environment.txt")
foreach($file in $RobotFilesToOverWrite)
{
    ...
}

# another way (if possible) is not to use an intermediate variable
foreach($file in Get-ChildItem -Path $tempExtractionDirectory -Recurse -Include "robots.$Environment.txt")
{
    ...
}

答案 1 :(得分:5)

引自http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx

  

ForEach语句不会迭代$ null

在PowerShell V2.0中,人们常常对以下内容感到惊讶:

PS> foreach($ i in $ null){'got here'} 来到这里

当cmdlet不返回任何对象时,通常会出现这种情况。在PowerShell V3.0中,您不需要添加if语句以避免迭代$ null。我们会为您照顾。