我有一个抓头器,不确定如何解决这个问题。 我正在寻找一个开明的人,他会知道这是怎么回事。
让我们从这个询问的核心部分,这个简单的代码开始。
Function New-Thingy {
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeline = $true)]$testing
)
# Tried playiing with encoding but it didn't do anything.
# $Encoding = [System.Text.Encoding]::Default
# [Console]::OutputEncoding = $Encoding
# [Console]::InputEncoding = $Encoding
Write-Host $testing
}
'options — test' | New-Thingy
请注意,在Powershell ISE中不会发生此问题,而在VSCODE和Powershell中会发生此问题(通过调用包含此代码的ps1脚本)。
在VS代码和Powershell中,运行脚本都会提供以下输出: 选项–测试代替
输出应为:选项-测试
随后在该行代码上使用 F8 会产生正确的输出,但是F5执行总是在错误的代码页上输出。
此外,使用可扩展字符串而不是单引号引起以下错误消息:
+ "options — test" | New-Thingy
+ ~~~~~~~~~~~~~~
The string is missing the terminator: ".
同样,Powershell ISE可以正常工作,产生正确的输出,并且在那里使用可扩展字符串也不会出现任何错误。
常规的Powershell控制台也可以,VS代码也可以。
我一直在寻找答案,但是我必须管理,我在这里有点迷路。
答案 0 :(得分:2)
在您的代码中,您使用的是长破折号(—
)。在Windows PowerShell中,如果您的脚本未使用bom保存为utf8,它将解析为“ ANSI”编码,该字符超出了该字符的范围,因为它占用的字节数超过了1个字节(如错误显示的字形所示)。在PowerShell Core(默认为utf8编码解析(相对于ANSI))中,此问题已得到纠正。
将Windows PowerShell脚本另存为utf8bom
会修复此“错误”。
在扩展名为settings.json
的VSCode powershell
中:
"[powershell]": {
"files.encoding": "utf8bom"
}