使用 DisplayNames 从文本文件中获取 SamAccountName

Get SamAccountName from text file with DisplayNames

我得到了一个有效的脚本,但由于我们的同事名字中包含 ö,ü,ä,csv 将它们解析为 ? (例如:Hörnlima = H?rnlima)。因此,它不会返回任何 SamAccountname,并且列表不再正确。我该如何纠正?

脚本:

Import-Csv D:\Files\PowerShell\TestME\DisplaynameToSamAccountName\Displaynames.txt | ForEach {
   Get-ADUser -Filter "DisplayName -eq '$($_.DisplayName)'" -Properties Name, SamAccountName | 
Select Name,SamAccountName
} | Export-CSV -path D:\Files\PowerShell\TestME\DisplaynameToSamAccountName\Accountnames.csv -NoTypeInformation

任何想法表示赞赏。

tl;dr:

例如,使用 Export-Csv -Encoding utf8 ... 将您的文件保存为 UTF-8 character encoding,这样可以确保保留 ö 等重音字符。


WindowsPowerShell中,Export-Csv很遗憾默认为ASCII编码,也就是说 US-ASCII 范围之外的任何字符 - 特别是 重音 字符,例如 ö - 被音译为 文字 ?.

也就是说,这样的字符丢失了,因为它们不能用ASCII编码表示。

PowerShell [Core] v6+所有 cmdlet 中,包括 Export-Csv,现在谢天谢地 default到 BOM-less UTF-8 编码.

关于使用 -Append 开关 附加 到预先存在的 CSV 文件而不指定 -Encoding 时的行为,请参阅


因此,特别是在Windows PowerShell中,使用-Encoding参数来指定想要的字符编码:

  • -Encoding utf8 是可取的,因为它能够编码所有 Unicode 字符。

    • Windows PowerShell 中,生成的文件将总是 具有 BOM。
    • PowerShell [Core] v6+ 中,它将是 BOM-less,这对于 cross-platform 兼容性通常更好,但您也可以使用 -Encoding utf8BOM 使用 BOM。
  • -Encoding Unicode (UTF-16LE) 编码是另一种选择,但会产生更大的文件(大多数字符由 2 字节)。此编码始终 导致 BOM。

  • -Encoding Default(Windows PowerShell)或
    -Encoding (Get-Culture).TextInfo.ANSICodePage (PowerShell [Core] v6+) on Windows 使用 您系统的活动 ANSI code page 创建一个 BOM-less 文件。

    • 这种遗留编码最好避免,但是,原因有很多:
      • 许多现代应用程序在没有 BOM 的情况下采用 UTF-8 编码。

      • 如果主机系统恰好有一个 不同的 活动 ANSI 页面,即使那些将文件读取为 ANSI-encoded 的人也可能以不同的方式解释文件。

      • 由于活动的 ANSI 代码页是(对于西方文化)固定的 single-byte 编码,因此只能表示 256 个字符,这只是所有 Unicode 字符的一小部分。


请注意,当 PowerShell 读取 一个 BOM-less 的文件(包括源代码)时,两者的行为不同版本:

  • Windows PowerShell中,假定Default,即系统的活动ANSI代码页.

    • 请注意,在 Windows 10 的最新版本中,现在可以将 UTF-8 设为 ANSI 代码页,但这样的 system-wide 更改可能会产生意想不到的后果 - 请参阅 .
  • PowerShell [Core] v6+中,假定UTF-8