新对象PSCredential无法正常工作 - 在语法上使用Unicode标点符号

时间:2017-08-24 13:56:04

标签: powershell unicode utf-8 punctuation

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

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

给出错误

  

新对象:找不到类型[ - TypeName   System.Management.Automation.PSCredential - ArgumentList]:验证   加载包含此类型的sembly。在C:\ ps \ login.ps1:14   焦炭:17   + ... rCredential =新对象 - TypeName System.Management.Automation.PSCre ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~       + CategoryInfo:InvalidType:(:) [New-Object],PSArgumentException       + FullyQualifiedErrorId:TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

任何人都有一些线索如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

TypeName参数前面的ArgumentList不是连字符,而是EN破折号(U + 2013),这会使解析器运行起来。用连字符(-)替换它们:

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

\p{Pd}是“ P unctuation, d ashes”的unicode类

编者注::PowerShell,或许令人惊讶的是, 使用(简称)代替常规ASCII时出现问题-range -(“破折号”,技术上:连字符减号) - 例如,尝试Get-ChildItem –File
OP的唯一问题是字符编码,如果您转换为常规“破折号”,则碰巧绕过。 将Unicode en破折号转换为ASCII“破折号”只是一个 stopgap :它掩盖了OP保存文件的真正问题,该文件具有Windows PowerShell错误解释的编码。如果该文件包含非ASCII字符作为数据,它仍然会被破坏。

答案 1 :(得分:1)

PowerShell很不寻常,允许 ASCII范围标点和可互换使用与(非ASCII) Unicode标点符号和空白 em> - 请参阅this answer的底部。

因此,使用非ASCII字符 EN DASH(U+2013)代替ASCII字符- HYPHEN-MINUS(U+002D not not 本身就存在问题。

您的案例中的问题是 字符编码问题,正如您的错误输出所证明的那样:en dashes并未被识别,因为 - as as您之后在评论中说过 - 您的源代码文件是UTF-8编码的但缺少BOM ,导致PowerShell将其解释为" ANSI"代码页编码(例如,美国 - 英语系统上的代码页Windows-1252)。

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

使用UTF-8保存源代码通常是一个好主意,但在 Windows PowerShell 上,必须包含BOM <登记/> 也就是说,如果您的源代码不是包含任何非ASCII字符,那么就不会有问题。

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

请注意,PowerShell Core 不会出现此问题,因为它默认为UTF-8(但仍能正确识别UTF-8 BOM,如果存在)。