将发布管道值编码为命令

时间:2018-08-30 22:59:02

标签: powershell

我有一个抓头器,不确定如何解决这个问题。 我正在寻找一个开明的人,他会知道这是怎么回事。

让我们从这个询问的核心部分,这个简单的代码开始。

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代码也可以。

我一直在寻找答案,但是我必须管理,我在这里有点迷路。

1 个答案:

答案 0 :(得分:2)

在您的代码中,您使用的是长破折号()。在Windows PowerShell中,如果您的脚本未使用bom保存为utf8,它将解析为“ ANSI”编码,该字符超出了该字符的范围,因为它占用的字节数超过了1个字节(如错误显示的字形所示)。在PowerShell Core(默认为utf8编码解析(相对于ANSI))中,此问题已得到纠正。

将Windows PowerShell脚本另存为utf8bom会修复此“错误”。

在扩展名为settings.json的VSCode powershell中:

"[powershell]": {
    "files.encoding": "utf8bom"
}