2009-08-13 14 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)"]} 

フォルダ名が正確に、そしてEBGreenノートとして、あなたをLogonNameと一致しない場合ハッシュテーブル(!$ users ["$($ .Name)"])のインデックスに使用するときに、キー($ users ["$($ .LogonName)"])またはフォルダ名を調整する必要があります。

+0

Genius!私はあなたのコードを完全に理解していませんが、間違いなく動作します!お互いに感謝しています。申し訳ありませんが、私はスタックオーバーフローのnoobですし、まだあなたを投票することはできません! –

+1

Essentialy $ users = @ {}はハッシュテーブル(または辞書)を作成します。 2行目は、すべてのユーザーログオン名と値$ trueでその辞書にデータを埋め込みます。最後の行では、各フォルダをスキャンし、その名前(フルパスではない)がハッシュテーブルにあるかどうかを確認します。そうでない場合は、孤立したフォルダがあります。 –

+1

これははるかに良い解決策です。しかし、$ UserListには実際には "LogonName"プロパティを持つPSObjectのコレクションが含まれているため、前のコードは機能しません。したがって、 "if"ステートメントはPSObjectコレクションをStringと比較しようとしているため、一致しません。どんなOO環境でも、あなたはどのタイプのオブジェクトを比較しているのか知っていなければなりません。代わりにログオン名を取得することでこれを修正できます:$ UserList = get-qaduser -sizelimit 0 | for-each {$ _。LogonName} – JasonMArcher

1

-containsが一致します。通常はそうではありません。ほとんどの企業では、fooという名前のユーザーに対してフォルダ名がfoo $になります。

関連する問題