1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-14 01:32:27 +08:00

fix: fix ExecCommand bug in windows

This commit is contained in:
dudaodong
2022-12-09 19:10:55 +08:00
parent af5cfe6da1
commit 09d98745b0
2 changed files with 64 additions and 20 deletions

View File

@@ -9,6 +9,10 @@ import (
"os" "os"
"os/exec" "os/exec"
"runtime" "runtime"
"unicode/utf8"
"github.com/duke-git/lancet/v2/validator"
"golang.org/x/text/encoding/simplifiedchinese"
) )
// IsWindows check if current os is windows // IsWindows check if current os is windows
@@ -50,27 +54,61 @@ func CompareOsEnv(key, comparedEnv string) bool {
return env == comparedEnv return env == comparedEnv
} }
// ExecCommand use shell /bin/bash -c to execute command // ExecCommand execute command, return the stdout and stderr string of command, and error if error occur
// param `command` is a complete command strinig, like, ls -a (linux), dir(windows), ping 127.0.0.1
// for linux, use /bin/bash -c to execute command
// for windows, use powershell.exe to execute command
func ExecCommand(command string) (stdout, stderr string, err error) { func ExecCommand(command string) (stdout, stderr string, err error) {
var out bytes.Buffer var out bytes.Buffer
var errout bytes.Buffer var errOut bytes.Buffer
cmd := exec.Command("/bin/bash", "-c", command) cmd := exec.Command("/bin/bash", "-c", command)
if IsWindows() { if IsWindows() {
cmd = exec.Command("cmd") cmd = exec.Command("powershell.exe", command)
} }
cmd.Stdout = &out cmd.Stdout = &out
cmd.Stderr = &errout cmd.Stderr = &errOut
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
stderr = string(errout.Bytes()) if utf8.Valid(errOut.Bytes()) {
stderr = byteToString(errOut.Bytes(), "UTF8")
} else if validator.IsGBK(errOut.Bytes()) {
stderr = byteToString(errOut.Bytes(), "GBK")
}
return
}
data := out.Bytes()
if utf8.Valid(data) {
stdout = byteToString(data, "UTF8")
} else if validator.IsGBK(data) {
stdout = byteToString(data, "GBK")
} }
stdout = string(out.Bytes())
return return
} }
func byteToString(data []byte, charset string) string {
var result string
switch charset {
case "GBK":
decodeBytes, _ := simplifiedchinese.GBK.NewDecoder().Bytes(data)
result = string(decodeBytes)
case "GB18030":
decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(data)
result = string(decodeBytes)
case "UTF8":
fallthrough
default:
result = string(data)
}
return result
}
// GetOsBits get this system bits 32bit or 64bit // GetOsBits get this system bits 32bit or 64bit
// return bit int (32/64) // return bit int (32/64)
func GetOsBits() int { func GetOsBits() int {

View File

@@ -11,10 +11,10 @@ func TestOsDetection(t *testing.T) {
assert := internal.NewAssert(t, "TestOsJudgment") assert := internal.NewAssert(t, "TestOsJudgment")
osType, _, _ := ExecCommand("echo $OSTYPE") osType, _, _ := ExecCommand("echo $OSTYPE")
if strings.Index(osType, "linux") != -1 { if strings.Contains(osType, "linux") {
assert.Equal(true, IsLinux()) assert.Equal(true, IsLinux())
} }
if strings.Index(osType, "darwin") != -1 { if strings.Contains(osType, "darwin") {
assert.Equal(true, IsMac()) assert.Equal(true, IsMac())
} }
} }
@@ -44,21 +44,27 @@ func TestOsEnvOperation(t *testing.T) {
func TestExecCommand(t *testing.T) { func TestExecCommand(t *testing.T) {
assert := internal.NewAssert(t, "TestExecCommand") assert := internal.NewAssert(t, "TestExecCommand")
out, errout, err := ExecCommand("ls") // linux or mac
t.Log("std out: ", out) stdout, stderr, err := ExecCommand("ls")
t.Log("std err: ", errout) t.Log("std out: ", stdout)
t.Log("std err: ", stderr)
assert.Equal("", stderr)
assert.IsNil(err) assert.IsNil(err)
out, errout, err = ExecCommand("abc") // windows
t.Log("std out: ", out) stdout, stderr, err = ExecCommand("dir")
t.Log("std err: ", errout) t.Log("std out: ", stdout)
if err != nil { t.Log("std err: ", stderr)
t.Logf("error: %v\n", err) assert.IsNil(err)
}
if !IsWindows() { // error command
assert.IsNotNil(err) stdout, stderr, err = ExecCommand("abc")
} t.Log("std out: ", stdout)
t.Log("std err: ", stderr)
// if err != nil {
// t.Log(err.Error())
// }
assert.IsNotNil(err)
} }
func TestGetOsBits(t *testing.T) { func TestGetOsBits(t *testing.T) {