V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
AirTag

Go 调用命令行程序打印输出

  •  
  •   AirTag · Aug 16, 2022 · 1626 views
    This topic created in 1353 days ago, the information mentioned may be changed or developed.

    本人 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)
    	}
    	*/
    
    4 replies    2022-08-17 11:11:34 +08:00
    liaohongxing
        1
    liaohongxing  
       Aug 16, 2022
    定义一个 buff 打印:
    var stdout, stderr bytes.Buffer
    compressCmd.Stdout = &stdout
    compressCmd.Stderr = &stderr
    fmt.Println(stdout.String(), stderr.String())
    zhuweiyou
        2
    zhuweiyou  
       Aug 16, 2022
    stdout, err := cmd.StdoutPipe()
    err = cmd.Start()
    defer cmd.Wait()
    go io.Copy(os.Stdout, stdout)
    Slurp
        3
    Slurp  
       Aug 16, 2022
    这种问题直接 Google 啊:

    cmd := exec.Command("ls", "-l")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    cmd.Run()

    @liaohongxing 你这个写法应该有问题,不能实时输出,而是等命令跑完了再输出。和答主要求不太一致
    AirTag
        4
    AirTag  
    OP
       Aug 17, 2022
    @Slurp 谢谢,这歌是我当初想要的效果。之前谷歌了很久,都没有找到解决方法,都是要么命令执行完后打印,要么就根本不打印。
    十分感谢。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2406 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:40 · PVG 09:40 · LAX 18:40 · JFK 21:40
    ♥ Do have faith in what you're doing.