我有一个部署 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中修复
答案 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。我们会为您照顾。