2009-08-13 3 views
2

네트워크에 연결된 사용자 계정이없는 사용자 폴더가 있는지 확인하려고합니다. 과반수가 "Found"를 반환해야하는 경우 모든 결과는 "Missing"을 반환합니다. 어떤 아이디어? 컬렉션의 항목을 사용하면 $ Folder.Name 정확히 LogonName와 같은지 확인 할 수 있도록 테스트하는 것과 동일한 경우Powershell - Quest CMDlets로 배열 검색 및 비교

$Dir = "\\ServerName\Share\" 
$FolderList = Get-ChildItem($Dir) | where {$_.psIsContainer -eq $true} 
$UserList = get-qaduser -sizelimit 0 | select LogonName 

foreach ($Folder in $FolderList) 
{ 
if ($UserList -contains $Folder.name) 
{ 
"Found: " + $Folder.name 
} 
Else 
{ 
"Missing: " + $Folder.name 
} 
} 

답변

2

하는 방법 (키의 매우 빠른 조회 제공) 해시 테이블을 사용하는 약간 다른 접근 시도에 대해 :

$users = @{} 
Get-QADUser -sizelimit 0 | Foreach {$users["$($_.LogonName)"] = $true} 
$dir = "\\ServerName\Share\" 
Get-ChildItem $dir | Where {$_.PSIsContainer -and !$users["$($_.Name)"]} 

폴더 이름이 정확히 LogonName 일치하지 않는 경우, 다음과 같은 EBGreen 노트, 당신 ($ users [ "$ ($ .LogonName)"]) 또는 폴더 이름을 사용하여 해시 테이블 (! $ users [ "$ ($ .Name)"])을 색인화 할 때 키를 조정해야합니다.

+0

Genius! 아직 코드를 완전히 이해하지는 못했지만 확실히 작동합니다! 두 분 모두 귀하의 의견에 감사드립니다. 미안 해요 스택 오버플로 놈이고 아직 당신을 투표 할 수 없습니다! –

+1

Essentialy $ users = @ {}는 해시 테이블 (또는 사전)을 만듭니다. 두 번째 줄은 사전에 모든 사용자 로그온 이름과 $ true 값을 채 웁니다. 그런 다음 마지막 줄에서 각 폴더를 검사하고 전체 경로가 아닌 이름이 해시 테이블에 있는지 확인합니다. 그렇지 않은 경우 고아 폴더가 있습니다. –

+1

이것은 훨씬 더 나은 해결책입니다. 그러나 $ UserList에는 실제로 "LogonName"속성이있는 PSObject 컬렉션이 들어 있기 때문에 이전 코드가 작동하지 않습니다. 따라서 "if"문은 PSObject 컬렉션을 String과 비교하려고하므로 일치하지 않습니다. 모든 OO 환경에서 비교할 개체 유형을 알고 있어야합니다. 대신 로그온 이름 만 가져와이 문제를 해결할 수 있습니다. $ UserList = get-qaduser -sizelimit 0 | for-each {$ _. LogonName} – JasonMArcher

1

-contains이 일치합니다. 보통 그렇지 않을 것입니다. 대부분의 회사는 foo라는 사용자의 폴더 이름을 foo $로 지정합니다.