2014-05-23 1 views
1

그래서 저는 Exchange 배포 그룹에 있는지 확인하고 필요한 경우 추가하는 powershell 스크립트를 작성하고 있습니다.Powershell - Select-String - 원하는대로 작동하지 않습니까?

스크립트가 까다로운 이유 중 하나는 스크립트가 "신뢰할 수없는"소스에서 데이터를 가져 오는 것입니다. 즉, 내가 확인할 사용자 이름이 있다는 것을 보장 할 수는 없습니다.

그래서 빈 문자열의 경우를 확인해야합니다. 내 사용자 이름은 $tempUserName 변수에 저장되어 있으며 단지 문자열이며 메일 그룹의 이름은 $DefaultMobileDL에 저장되어 있습니다. 내가 들어 가지 않을 것 인 다른 이유를 위해 나는 if {} else {} 진술을 할 수 없다. 단지 진술 만 할 수있다. 그것은 매우 어리 석다. 나는 알고있다.

OK, 그래서 여기에 I 가지고 무엇인가

if (-not [string]::IsNullOrEmpty($tempUsername)) { 
    $MembersOfDLDefault = Get-DistributionGroupMember "$DefaultMobileDL" -ResultSize Unlimited | 
     Select -Expand sAMAccountName | 
     Select-String -pattern "$tempUsername" -SimpleMatch -Quiet 
} 
if ([string]::IsNullOrEmpty($tempUsername)) { $MembersOfDLDefault = $false } 

# bug testing... 
Write-Host "username: `"$tempUsername`" , MembersOfDLDefault: `"$MembersOfDLDefault`"" 

if ($MembersOfDLDefault -eq $false) { 
    # User is not a member of $DefaultMobileDL, try adding them 
    # ... more code here ... 
} 
if ($MembersOfDLDefault -eq $true) { 
    # User is already a member of the $DefaultMobileDL 
    # ... again, more code ... 
} 

해당 코드 블록은 foreach 루프이고, I는 변수 값의 끝에서, 각 반복 후에 전달되는 문제가 있었다 보낸 그것은 년후 경우

Clear-Variable MembersOfDLDefault 

지금은 설명서를 잘 읽고 있어요 경우, Select-String -Quiet이 True를 반환해야하는 항목이 발견 된 경우, 그리고 거짓 : 내 코드 나는 몇 가지 변수를 삭제하지만,이 예를 들어 중요한 하나 개의 라인입니다 '티.

그러나 그 결과는 아닙니다. ,

username: "smithj" , MembersOfDLDefault: "" 
username: "doej" , MembersOfDLDefault: "True" 
username: "" , MembersOfDLDefault: "False" 

당신이 볼 수 있듯이 : 여기에 내가 코드를 실행할 때 발생하는 것입니다 (이 실행에, 나는 3 내가 테스트 될 일이 사용자 이름 중 하나 (세 번째) 빈 문자열이) 코드가 처음 실행될 때 $MembersOfDLDefault이 아무것도 설정되지 않습니다.

나는 바보 같은 것을 놓친다는 것을 알고있다. 그러나 나는이 코드를 너무 오래 꼼짝 않고 바라보고 있었고, 그것에 대해 신선한 시각이 필요했다. 내가 놓치거나 간과하는 것이 명백한 것이 있습니까?

미리 감사드립니다. 나는 그 문제한다고 생각하지 않지만

기술적으로는 내가 직접 파워 쉘에서 Exchange 관리 셸에서이 작업을 실행하고 있지 않다 그것은 문서에 대한 -quiet을 말하는 것 같다

+0

그룹 구성원 목록에서 이름을 테스트 할 때 사용하는 것이 훨씬 간단하지 않습니까? – mjolinor

+0

'$ MembersOfDLDefault = Get-DistributionGroupMember "$ DefaultMobileDL"-ResultSize 무제한 | -Expand sAMAccountName'을 선택하면 나중에 if ($ MembersOfDLDefault -contains "$ tempUsername")? 원래 Powershell은'Get-DistributionGroupMember' 함수가 ** lot ** 데이터를 반환했기 때문에 불만을 토로했기 때문에 파이프를 사용하여 변수 크기를 줄이는 것이 좋습니다. – romellem

+0

메일 그룹이 큰 경우 다른 방법 대신 DL에 대한 사용자 그룹 구성원을 확인하는 것이 좋습니다. – mjolinor

답변

3

실제로 무엇을 do는 different입니다. 일치하지 않는 경우 Select-String -quite$null을 반환하는 것으로 보입니다. 이 시도를 확인하려면 : (내가 어떤 확인을 어느 방법을 찾을 수 없습니다)

# ~> "xxxHELLOaaa" | Select-String "HELLO" -SimpleMatch -Quiet 
True 

# ~> "xxxHELLOaaa" | Select-String "HaLLO" -SimpleMatch -Quiet 

어느 구현이 잘못 또는 문서입니다. 간단한 해결 방법은 결과를 부울 값으로 변환하는 것입니다.

+0

정말 고마워요! PowerShell에 익숙해 져서 명시 적 캐스팅을 할 수 있는지 알지 못했습니다. 그것은 트릭을했다. – romellem