2016-10-06 14 views
0

私は専門家のプログラマーではないので、どのロジックを理解しやすくするために使うべきですか?私はすべてのADユーザーを検索し、AD属性(オフィス)に基づいて、いくつかの文字列をいくつかの他の属性(市、郵便番号など)に書き込むスクリプトを作成しています。私はForeachを使って遊んでいました。そして、そのループの中で、置き換えられたset-ADUserかwhere節を使っていました。 IF、IfElseステートメントの束の非常に面倒な方法です。また、私はSwitch(Case)ステートメントを調べ始めました。ループのために使用するロジック。最も簡単なものと最も簡単なもの

提案がありますか?その上に構築するために、小さな始め

は、私はこれを開始しました:

代わり
$Users = Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" -filter {samaccountname -like "r*"} -properties * | Select samaccountname,streetaddress,l, postalcode,st,physicaldeliveryofficename 
foreach ($user in $users) { 
set-aduser $user -city "NoWhere" -Postalcode "B2B 2B2"| where {$_.physicaldeliveryofficename -eq "Head Office"} 
} 

またはスイッチ:複雑な外部リソースを照会するには、通常の99%がかかるため

$Users = Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" -filter {samaccountname -like "remot*"} -properties * | Select samaccountname,streetaddress,l, postalcode,st,physicaldeliveryofficename 
foreach ($user in $users) {switch ($users.physicaldeliveryofficename){ 
"Nowhere town" { -city "NoWhere" -postalcode "A1A A1A"} 
"Anywhereville" { -city "Anywhere" -postalcode "B1B B1B"} 
}} 
+0

それはスクリプトに多くの時間を依存します。しかし、通常、可読性は生の性能よりもはるかに重要です。 –

+1

PowerShellはSQLではない、 'Set-ADUser ... | Office = '本社'はpowershellでは無意味です。 – TessellatingHeckler

答えて

2
  1. は、クエリの最適化ランタイム。
  2. 使用パイプラインその処理は、リスト全体を蓄積することなく、すぐにを開始しますので:代わりにForEachステートメントを使用| ForEach { ......... }
    を。
  3. 停止onelinersを書く:あなたは+よう|({,、未完成の2オペランド演算子の後に新しい行を開始するか、パラメータの長いリストをラップする行の末尾に、単一のバッククォート `を使用することができます。
  4. Switchは、パイプライン処理時に利用可能なリストがないため、各要素を個別に処理する必要があるため、ここに行く方法です。

Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" ` 
      -filter 'samaccountname -like "r*"' ` 
      -properties * | 
    Select samaccountname, 
      streetaddress, 
      l, 
      postalcode, 
      st, 
      physicaldeliveryofficename | 
    ForEach { 
     switch ($_.physicaldeliveryofficename) { 
      "Nowhere town" { $city = "NoWhere"; $postalcode = "A1A A1A"; break } 
      "Anywhereville" { $city = "Anywhere"; $postalcode = "B1B B1B"; break } 
      default   { $city = "?"; $postalcode = "" } 
     } 
     Set-ADUser $_ -City $city -Postalcode $postalcode 
    } 
+0

ループ内にループをネストするのはなぜですか? {Set-ADUser $ _ -City "Nowhere";続行}; {$ _ physicaldeliveryofficename -match "Anywhere"} {Set-ADUser(Get-ADUser ) $ _ - シティー "どこでも";続行}} '。そして、私はポイント3を少し議論したいと思います。あなたが投稿したものとOPが持っているものの間には幸せな媒体がありますが、どちらも素晴らしいとはいえません。 – TheMadTechnician

+0

1. 'switch 'は実際にはループではないので、ネストされたループはありません。あなたの例では、パイプラインを利用していません。ユーザーのリスト全体を最初に取得するので、非常に長い休止が生じる可能性があります。単純なアクションを1つだけ実行する必要がある場合は、アプローチはより良いかもしれません。 2.#3について議論する必要はなく、常識や個人的な好みです。私はonelinersを書くことについても有罪ですが、それらは追記型の書き込み専用スクリプト用です。 – wOxxOm

+0

これは間違っています。ユーザーのリスト全体を最初にフェッチしません。それはユーザを取得し、それぞれの結果が受け取られるときに 'Switch'ステートメントに対して各ユーザを評価します。また、ループであるため、次のユーザーに移動するために 'Continue'ステートメントが動作します。 – TheMadTechnician

関連する問題