2017-05-03 6 views
1

など、foreachの中で、現在のアイテム変数を再利用しないように、他の理由がある:つまり再利用する変数

foreach ($a in $something) 
{Write-host $a} 
. 
. 
. 
foreach ($a in $somethingelse) 
{Write-host $a} 

、それは常にありますその2番目のケースで別の変数($ b?)を使用するのがベストになるでしょう

答えて

2

何も問題はありません。変数$aは常にforeachループ内の現在の項目に設定されます。

3

双生児主義者によれば、これは問題ありません。しかし、私がforeachループを実行するとき、私はあなたがそれを取っているものに指定しておく傾向があります。私は、これでラインをさらに理解しやすくなることがわかりました。これはアイデアではない理由を

#Example 1 
foreach ($item in $array) 
{Write-Host $item} 

#Example 2 
foreach ($user in $userList) 
{Write-Host $user} 

#Example 3 
foreach ($breed in $dogBreed) 
{Write-Host $breed} 
+0

私はこれに同意します。後続の 'foreach'ループが同じインスタンス変数を使用するのが理にかなっている場合は、ポスターが終わったときに再利用し、それが意味をなさない場合は新しい名前を使用します。本質的には、読みやすさを目指してください。 – briantist

+1

説明をありがとう。私の場合、私は2つの異なるコンピュータのリストから引っ張っているので、foreach($ list1の$ computer)とforeach($ list2の$ computer)は、何が使用されているかについてまだ理にかなっています。 – Clizby

1

一つの理由は、それが再割り当てされるまで、変数$aは(割り当てられた範囲内で)それは価値だ保持していることです。それは大きな問題のようには聞こえないかもしれませんが、時にはPowerShellは予期せぬことをしますが、そのようなことを理解するためのトラブルシューティングに時間を割く価値はありません。このfunctionを考えてみましょう。それが再割り当てされるまで

function reuse-vars { 

$arrayA = 0..3 
$arrayB = 10..13 
$arrayC = 20..23 

    foreach ($a in $arrayA){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

    foreach ($b in $arrayB){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

    foreach ($c in $arrayC){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

} 

$aは、ネストされたforeach内に含むこと、最後foreachの反復からの値を保持しますか、彼らは直列である場合。

C:\> reuse-vars 
$a is 0 
$b is 
$c is 
$a is 1 
$b is 
$c is 
$a is 2 
$b is 
$c is 
$a is 3 
$b is 
$c is 
$a is 3 
$b is 10 
$c is 
$a is 3 
$b is 11 
$c is 
$a is 3 
$b is 12 
$c is 
$a is 3 
$b is 13 
$c is 
$a is 3 
$b is 13 
$c is 20 
$a is 3 
$b is 13 
$c is 21 
$a is 3 
$b is 13 
$c is 22 
$a is 3 
$b is 13 
$c is 23 

それはあなたがやっているものに応じて重要ではないかもしれませんが、これは問題を引き起こす可能性が($bのように)各foreachのために別の変数名を夢見るすることがやりがいになります。

+0

私はこれが他のどの変数とも異なるとは思わない。これはまた、質問で尋ねられたシナリオに実際には対応していません。 – briantist

0

これはうまくいくはずですが、別の名前を使用する方が良い方法です。

しかし、あなたが妄想している場合は、必ずしも明確またはループの間で変数を手動で削除することができます。

foreach ($a in $something) 
{Write-host $a} 
. 
$a = $null; 
. 
foreach ($a in $somethingelse) 
{Write-host $a} 

または:

foreach ($a in $something) 
{Write-host $a} 
. 
Remove-Variable -Name a; 
. 
foreach ($a in $somethingelse) 
{Write-host $a} 
関連する問題