5

我有一个部署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 中得到修复

4

2 回答 2

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")
{
    ...
}
于 2012-12-07T18:04:04.093 回答
6

引自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) { '到这里' } 到这里

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

于 2012-12-07T18:50:12.933 回答