我正在尝试接受用户名和密码作为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
任何人都有一些线索如何解决这个问题?
答案 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,如果存在)。