【问题标题】:Powershell - Searching and Comparing Arrays with Quest CMDletsPowershell - 使用 Quest CMDlet 搜索和比较数组
【发布时间】:2010-11-19 09:19:15
【问题描述】:

尝试确定网络上是否有任何用户文件夹没有关联的用户帐户。当大多数结果应该返回“找到”时,所有结果都返回“缺失”。有什么想法吗?

$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
}
}

【问题讨论】:

    标签: arrays search powershell compare quest


    【解决方案1】:

    尝试一种稍微不同的方法,使用哈希表(提供异常快速的键查找):

    $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)"])。

    【讨论】:

    • 天才!虽然我还没有完全理解你的代码,但它确实有效!感谢你们两位的意见。抱歉,我是 Stack Overflow 新手,还不能投票给你!
    • 本质上 $users = @{} 创建一个哈希表(或字典)。第二行使用所有用户登录名和值 $true 填充该字典。然后在最后一行,我们扫描每个文件夹并检查它的名称(不是完整路径)是否在哈希表中。如果不是,那么您有一个孤立的文件夹。
    • 这是一个更好的解决方案。但是您之前的代码不起作用,因为 $UserList 实际上包含具有“LogonName”属性的 PSObjects 集合。因此,您的“if”语句试图将 PSObject 集合与字符串进行比较,因此不匹配。在任何 OO 环境中,您都必须知道要比较的对象类型。您可以通过仅获取登录名来解决此问题: $UserList = get-qaduser -sizelimit 0 |对于每个 {$_.LogonName}
    【解决方案2】:
    如果集合中的项目与您正在测试的项目相同,

    -contains 将匹配,因此请确保 $Folder.Name 与 LogonName 完全相同。通常不会。对于名为 foo 的用户,大多数公司会将文件夹名称设为 foo$。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2015-10-05
      • 2014-02-07
      • 1970-01-01
      相关资源
      最近更新 更多