本人 go 小白,在一个 go 程序中调用了 7z 的命令行版本来按照一定的规则批量压缩文件。
但是发现在调用过程中不打印 7z 的命令输出,比如压缩进度,压缩结果之类的。
压缩过程是一切正常的。
该怎么调用就像直接使用 7z 那样可以在控制台打印压缩过程呢? 新开个窗口再打印也是可以接受的。
下面是我的代码,其中注释的内容是尝试过的,并不好使。
execPath := ""
sysType := runtime.GOOS
if sysType == "windows" {
execPath = "D:\\Program Files\\7-Zip\\7z.exe"
} else if sysType == "darwin" {
execPath = "/usr/local/bin/7z"
}
compressCmd := exec.Command(execPath, args...)
compressCmd.Stderr = compressCmd.Stdout
/*
stdOut, stdOutErr := compressCmd.StdoutPipe()
if stdOutErr != nil {
fmt.Println("stdOut Error:", stdOutErr)
}
if err := compressCmd.Start(); err != nil {
fmt.Println("Compress Error:", err)
}
for {
tmp := make([]byte, 1024)
_, err := stdOut.Read(tmp)
fmt.Print(string(tmp))
if err != nil {
break
}
}
if waitErr := compressCmd.Wait(); waitErr != nil {
fmt.Println("compressCmd.Wait() Error", waitErr)
}
*/
1
liaohongxing 2022-08-16 10:34:44 +08:00
定义一个 buff 打印:
var stdout, stderr bytes.Buffer compressCmd.Stdout = &stdout compressCmd.Stderr = &stderr fmt.Println(stdout.String(), stderr.String()) |
2
zhuweiyou 2022-08-16 10:34:56 +08:00
stdout, err := cmd.StdoutPipe()
err = cmd.Start() defer cmd.Wait() go io.Copy(os.Stdout, stdout) |
3
Slurp 2022-08-16 17:58:04 +08:00
这种问题直接 Google 啊:
cmd := exec.Command("ls", "-l") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Run() @liaohongxing 你这个写法应该有问题,不能实时输出,而是等命令跑完了再输出。和答主要求不太一致 |