2016-10-06 3 views
0

필자는 전문가 프로그래머가 아니기 때문에 어떤 논리를 이해하기 쉽지만 효율적인 스크립트로 사용해야합니까? 모든 AD 사용자를 검색하고 AD 속성 (예 : 사무실)을 기반으로하는 스크립트를 작성 중이므로 몇 가지 다른 속성 (도시, 우편 번호 등)에 문자열을 쓸 것입니다. 나는 Foreach를 가지고 놀았고 그 루프 내에서 replace 또는 where 절을 가진 set-ADUser를 사용했다. 또는 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 : 당신은 후 새 줄을 시작할 수 있습니다 |, (, {, ,, 미완성 두 피연산자 + 같은 사업자 또는 매개 변수의 긴 목록을 포장 라인의 끝에 하나의 역음을`사용합니다.
  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 - "Anywhere"와 일치} {Set-ADUser (Set-ADUser ) $ _ - 도시 "아무 데나"; 계속}}'. 그리고 나는 포인트 3을 조금 논쟁 하겠지만, 당신이 게시 한 것과 OP가 가지고있는 것 사이에 행복한 매개체가 있습니다. 그러나 제 생각에는 위대한 것은 없습니다. – TheMadTechnician

+0

1. 'switch'는 실제로 루프가 아니기 때문에 중첩 루프가 없습니다. 귀하의 예를 들어, 그것은 파이프 라인을 활용하지 않습니다 : 그것은 아주 긴 일시 중지가있을 수 있으므로 사용자의 전체 목록을 먼저 가져옵니다. 단 하나의 간단한 조치 만 수행해야하는 경우 귀하의 접근 방식이 더 나을 수도 있습니다. 2. # 3에 대해 논할 필요는 없습니다. 상식과 개인적인 취향입니다. 필자는 oneliners를 작성하는 것에 대해서도 유죄이지만 Write-Once Write-Only 스크립트를위한 것입니다. – wOxxOm

+0

그 말이 맞지 않습니다. 먼저 전체 사용자 목록을 가져 오지 않습니다. 그것은 사용자를 얻고 각 결과가 수신 될 때'Switch' 문에 대해 각 사용자를 평가할 것입니다. 또한 루프이므로 반복적으로 'Continue' 문이 작동하여 발견 된 다음 사용자로 이동합니다. – TheMadTechnician