gpt4 book ai didi

powershell - Golang 调用 PowerShell.exe 总是返回 ASCII 字符

转载 作者:IT王子 更新时间:2023-10-29 01:38:11 26 4
gpt4 key购买 nike

我正在使用 Go 编写的应用程序中的 PowerShell,但无法让它返回非 ASCII 字符。起初我使用 go-powershell,但遇到同样的问题:https://github.com/gorillalabs/go-powershell/issues/10现在使用稍微更基本的方法:

package main

import (
"bytes"
"fmt"
"os/exec"
)

type PowerShell struct {
powerShell string
}

func New() *PowerShell {
ps, _ := exec.LookPath("powershell.exe")
return &PowerShell{
powerShell: ps,
}
}

func (p *PowerShell) Execute(args ...string) (stdOut string, stdErr string, err error) {
args = append([]string{"-NoProfile", "-NonInteractive"}, args...)
cmd := exec.Command(p.powerShell, args...)

var stdout bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr

err = cmd.Run()
stdOut, stdErr = stdout.String(), stderr.String()
return
}

func main() {
posh := New()
stdout, stderr, err := posh.Execute("$OutputEncoding = [Console]::OutputEncoding; (Get-VMSwitch).Name")

fmt.Println(stdout)
fmt.Println(stderr)

if err != nil {
fmt.Println(err)
}
}

但同样的事情发生了。它不是获取 Przełąś,而是返回 Przelas。当在代码中进一步使用此虚拟交换机名称创建 VM 时,这将导致问题。它不会被识别和错误。

注意:$OutputEncoding = [Console]::OutputEncoding; 没有任何效果。它确实发生了变化,但结果保持不变。

注意 2:直接从命令提示符调用相同的命令没有问题:powershell.exe -NoProfile -NonInteractive $OutputEncoding = [Console]::OutputEncoding; (Get-VMSwitch).Name") 甚至 powershell.exe -NoProfile -NonInteractive (Get-VMSwitch).Name")。换句话说,它仅在使用 exec.Command 时从 Go 执行此操作。

注意 3:这是为了解决虚拟机驱动程序在本地化名称方面的问题。是的,它可以改为使用 GUID (.Id),但这个问题在系统的不同部分仍然存在。

最佳答案

伙计,Powershell 很有趣。这主要是一系列反复试验的结果。

基本上,您想要设置[Console]::OutputEncoding,而不是捕获它。

但是,要自己清理,将其设置回原始值也无妨。我还没有完全理解它,但通过多次 exec() 调用,变化仍然存在。

这是一个例子:

<... everything else is as above ...>

func main() {
posh := New()

fmt.Println("With encoding change:")
stdout, stderr, err := posh.Execute(
"$test = \"Przełąś\"\n" +
"$old = [Console]::OutputEncoding\n" +
"[Console]::OutputEncoding = [Text.Encoding]::UTF8\n" +
"[Console]::OutputEncoding\n" +
"$test\n" +
"[Console]::OutputEncoding = $old")
fmt.Println(stdout)
fmt.Println(stderr)
if err != nil {
fmt.Println(err)
}

fmt.Println("Without encoding change:")
stdout, stderr, err = posh.Execute(
"$test = \"Przełąś\"\n" +
"[Console]::OutputEncoding\n" +
"$test")
fmt.Println(stdout)
fmt.Println(stderr)
if err != nil {
fmt.Println(err)
}
}

输出:

$ ./exec-powershell.exe
With encoding change:


BodyName : utf-8
EncodingName : Unicode (UTF-8)
HeaderName : utf-8
WebName : utf-8
WindowsCodePage : 1200
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : False
CodePage : 65001

Przełąś




Without encoding change:


IsSingleByte : True
BodyName : IBM437
EncodingName : OEM United States
HeaderName : IBM437
WebName : IBM437
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 437

Przelas

关于powershell - Golang 调用 PowerShell.exe 总是返回 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50809752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com