新对象 PSCredential 不起作用 - 在句法上使用 Unicode 标点符号

New Object PSCredential not working - using Unicode punctuation syntactically

我正在尝试接受用户名和密码作为 Powershell 脚本的参数,但是新对象

$UserID="Name"
$SecurePassword=convertto-securestring -AsPlainText -Force -String $Password
New-object –TypeName System.Management.Automation.PSCredential –ArgumentList ($UserID,$SecurePassword)

报错

New-object : Cannot find type [â€TypeName System.Management.Automation.PSCredential â€ArgumentList]: verify that the as sembly containing this type is loaded. At C:\ps\login.ps1:14 char:17 + ... rCredential=New-object –TypeName System.Management.Automation.PSCre ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

有人知道如何解决这个问题吗?

TypeNameArgumentList 参数前面的 不是连字符,而是 EN 破折号 (U+2013),这会使解析器出错。将它们替换为连字符 (-):

'New-object –TypeName System.Management.Automation.PSCredential –ArgumentList ($UserID,$SecurePassword)' -replace '\p{Pd}','-'

\p{Pd} 是“Punctuation, dashes”的 unicode class

编者注:也许令人惊讶的是,PowerShell 在使用 没有 有问题(破折号)代替常规的 ASCII 范围 -("dash",技术上:连字符减去 )- 例如尝试 Get-ChildItem –File .
OP 的唯一问题是 字符编码,如果您转换为常规 "dashes",您碰巧 绕过 ]. 将 Unicode en dashes 转换为 ASCII "dashes" 只是一个 权宜之计 :它掩盖了 OP 的真正问题,即使用 [=51] 的编码保存文件=] PowerShell 错误解释。如果该文件包含非 ASCII 字符,如 data,它仍然会损坏。

PowerShell 的不同寻常之处在于它允许 可互换使用 ASCII-range 标点符号和空格 与 (non-ASCII) Unicode 标点符号和空格 - 请参阅 this answer 的底部部分以获取完整的字符列表。

因此,使用 non-ASCII 字符 EN DASH (U+2013) 代替 ASCII 字符 - HYPHEN-MINUS (U+002D ) 不是本身的问题。

您遇到的问题是字符编码问题,您的错误输出证明了这一点:无法识别破折号因此,因为 - 正如您稍后在评论中所说 - 您的源代码文件是 UTF-8 编码的 但缺少 BOM,导致 PowerShell 将其解释为“ANSI”代码 page-encoded(例如,US-English 系统上的代码页 Windows-1252)。

这种错误解释导致 被解释为 â€,这才是问题的真正原因。

使用 UTF-8 保存源代码通常是个好主意,但在 Windows PowerShell 上,您 必须包括 BOM.
也就是说,如果您的源代码 碰巧不 包含任何 non-ASCII 个字符,就不会有问题。

通常,BOM 要求与 UTF-8 在其他平台上的使用不一致,在其他平台上 BOM 甚至可能会导致问题(但在 PowerShell 中不会);也许出于这个原因 现代编辑器,例如 Visual Studio Code 和 Sublime Text 默认为 BOM-less UTF-8,必须明确指示保存 一个BOM;虽然您通常可以将默认设置更改为包含 BOM,但如果支持,最好只对 PowerShell 文件执行此操作。

请注意,PowerShell Core 没有这个问题,因为它 默认 为 UTF-8(但仍能正确识别 UTF -8 BOM,如果存在的话)。