$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"
$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*$user*" } | Select-Object SamAccountName, Enabled
}
$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"
在上面运行不会导出任何内容到 CSV,但如果我添加,Write-Host "$User"
它会导出用户列表。所以我知道导出功能有效。
如果我像这样运行它:
$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"
$test = Foreach ($user in $users){
Get-ADUser -Filter {Name -like "*User 1*" } | Select-Object SamAccountName, Enabled
}
$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"
它用“用户 1”(文档中的第一个用户,这是预期结果)的结果填充我的 CSV,其次数与 $user 变量中的行数相同。所以我知道我的搜索方法有效。
所以我的问题是如何让它循环遍历我的 CSV 文件并在使用对象搜索时真正找到任何东西?因为当我使用手动输入的字符串时它可以工作,但使用对象时则不行。
CSV 格式如下:
USER 1
USER 2
USER 3
USER 4
编辑:问题与 foreach 循环无关,如果我运行以下命令:
$test = "TEST USER"
Get-ADUser -Filter {Name -eq "*$test*"}
它仍然不起作用,一定是与过滤方式有关。
答案1
通常,当创建由多个字符串组合而成的搜索过滤器时,我会避免在输入本身中这样做。例如(正如您所发现的),不要执行以下操作
Get-ADUser -Filter {Name -like "*$user*"}
我尝试创建一个过滤器然后调用该函数
$filter = "*" + $user + "*"
Get-ADUser -Filter {Name -like $filter}
我发现这是成功构建 LDAP 过滤器作为多个字符串组合的唯一方法。这还使您能够在运行查询之前验证过滤器。
答案2
根据 Eric Schnabel 下面的我的评论,您不应该将“$”变量放在过滤器的引号内。您的更新脚本应该将通配符与变量结合起来,以使过滤器正常工作
$users = Get-Content "C:\PowerShellScript\CSV\swyxusers.csv"
$test = Foreach ($user in $users){
$user = "*" + $user + "*"
Get-ADUser -Filter {Name -like $user } | Select-Object SamAccountName, Enabled}
$test| export-csv -Force -Append "C:\PowerShellScript\CSV\skit.csv"
答案3
因此,正如我在编辑中所述,这与过滤有关。现在我找到了解决方案,我实际上觉得自己很愚蠢。
这不会起作用:
Get-ADUser -Filter {Name -like "*$user*" }
这也不起作用:
Get-ADUser -Filter {Name -like "$user" }
但这有效:
Get-ADUser -Filter {Name -like $user}
如果有“或*”,它将会中断,并且无法运行,不会出现错误消息。
在这里找到了解决方案:http://www.powershellish.com/blog/2015-11-17-ad-filter