5

潜在的な robots.dev.txt を robots.txt にコピーするPowerShell 2.0スクリプトの展開の一部があります。存在しない場合は何もしません。

私の元のコードは次のとおりです。

$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) { 'get here' } got here

この状況は、コマンドレットがオブジェクトを返さない場合によく発生します。PowerShell V3.0 では、$null の繰り返しを避けるために if ステートメントを追加する必要はありません。私たちはあなたのためにそれを世話します。

于 2012-12-07T18:50:12.933 に答える