我正在尝试使用 Get-ADUser 提取选定的用户集。这些用户所属的公司名称包含非 ASCII 字符,例如“Gåäördet”。不幸的是,我们必须使用公司属性来完成这项任务,而且我们还需要它从脚本中运行。
以下内容在交互式会话中运行良好,但在脚本中执行时不返回任何数据:
$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"
我发现的解决方法有效但不够可靠(有选择错误对象的风险):
# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?
...或者...
# Work-around 2:
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"
补充说明:字符编码可能不是这里的问题。根据评论中的建议,我将其放在脚本中。阅读每个 Get-ADUser 行的注释:
$OutputEncoding = [Console]::OutputEncoding
$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
$Company = "åäö"
Get-ADUser -Filter "company -eq '$Company'" # No matches
我希望你们中的一些人可以为这个难题提供更好的解决方案。
答案1
感谢这里所有人的帮助,让我彻底了解了这种奇怪行为,非常感谢!
事实证明,“-Filter”参数可以与“aao”互换使用“åäö”。这不是 PowerShell 的所作所为,而是堆栈的进一步发展(感谢 @RyanRies 对此的调查)。这就是以下代码片段有效的原因:
$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
事实证明查询不区分大小写,因此这也有效:
$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
实际上,“åäö”只要是 unicode 查询也可以工作(感谢@Daniel):
$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
最后我们有两个选择:
- 将查询中的“åäö”替换为“aao”。输出结果与使用“åäö”相同。
- 将“åäö”替换为unicode(@joel-coel,感谢您的提醒),例如使用脚本。
我选择了第二种方案,结果看起来有点像这样:
function UniReplace($n){
[char][int]"0x$n"
}
$Company = "åäö"
$Company = $Company -Replace 'ä',"$(UniReplace E4)"
$Company = $Company -Replace 'Ä',"$(UniReplace C4)"
$Company = $Company -Replace 'å',"$(UniReplace E5)"
$Company = $Company -Replace 'Å',"$(UniReplace C5)"
$Company = $Company -Replace 'ö',"$(UniReplace F6)"
$Company = $Company -Replace 'Ö',"$(UniReplace D6)"
echo "This is the content of string `$Company: $Company"
Get-ADUser -Filter "company -eq '$Company'"
我想目前这已经是最好的了。
答案2
我或许能帮你找到解决方法。
创建一个 Unicode 编码的文本文件并插入公司名称。然后使用Get-Content
变量存储公司名称。
$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }
我使用中文文本(中國哲學書電子化計劃)对其进行了测试,它在我的服务器上运行良好。
答案3
您可以尝试通过代码点代理来构建名称:
它并没有好多少,但至少它允许你将整个脚本包含在源文件中。