【问题标题】:Encoding issue piping value to command将问题管道值编码为命令
【发布时间】:2018-08-30 22:59:02
【问题描述】:

我有一个令人头疼的问题,我不确定如何解决这个问题。 我正在寻找一个开明的人,他会知道这是关于什么的。

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

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 中,运行脚本会产生以下输出: 选项 - 测试代替

输出应该是:options — test

之后在该行代码上使用 F8 会产生正确的输出,但 F5 执行总是在错误的代码页上输出。

此外,使用可扩展字符串而不是单引号会产生以下错误消息:

+ "options — test" | New-Thingy
+                  ~~~~~~~~~~~~~~
The string is missing the terminator: ".
  • 如何获得正确的输出? 我尝试更改控制台输出/输入编码,但没有任何改变
  • 可扩展字符串发生了什么问题,有什么方法可以防止它发生吗?

同样,Powershell ISE 可以正常工作,产生正确的输出,并且在此处使用可扩展字符串不会给出任何错误。

常规的 powershell 控制台和 VS 代码一样。

我正在继续寻找答案,但我必须管理我在这里有点迷路。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    在您的代码中,您使用的是长破折号 ()。在 Windows PowerShell 中,如果您的脚本未使用 bom 保存为 utf8,它会将其解析为该字符超出范围的“ANSI”编码,因为它占用了超过 1 个字节,正如您可以从被歪曲的字形中看到的那样。这在默认为 utf8 编码解析(相对于 ANSI)的 PowerShell Core 中得到了纠正。

    以后将您的 Windows PowerShell 脚本保存为 utf8bom 将修复此“错误”。

    在带有 powershell 扩展名的 VSCode 中 settings.json

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

    【讨论】:

    • 哇!非常感谢 VSCode 设置!!!这将非常方便。
    • @SagePourpre 唯一会引起摩擦的地方是如果您正在为 powershell core 编写脚本(根据我的经验,这不会很快)。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2019-10-01
    • 2016-03-30
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多