栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从代码内部与外部应用程序进行交互

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从代码内部与外部应用程序进行交互

您有两种可能性。首先是使用ReadLine(),但这仅在应用程序输出为全行时才有效,并且您可以等待
n。rm并非如此,因此您必须为Scanner开发一个自定义的SplitFunction
。可以在下面找到这两个版本。

请注意,您不能使用CombinedOutput,因为它不能被扫描。您必须使用管道。

package mainimport (    "bufio"    //"fmt"    "log"    "os/exec")func main() {    cmd := exec.Command("rm", "-i", "somefile.txt")    // Stdout + stderr    out, err := cmd.StderrPipe() // rm writes the prompt to err    if err != nil {        log.Fatal(err)    }    r := bufio.NewReader(out)    // Stdin    in, err := cmd.StdinPipe()    if err != nil {        log.Fatal(err)    }    defer in.Close()    // Start the command!    err = cmd.Start()    if err != nil {        log.Fatal(err)    }    line, _, err := r.ReadLine()    for err != nil {        if string(line) == "Remove file 'somefile.txt'?" { in.Write([]byte("yn"))        }        line, _, err = r.ReadLine()    }    // program completes normally...s}

这是扫描仪的第二个版本,它同时使用 n和?作为行定界符:

package mainimport (    "bufio"    "bytes"    "fmt"    "log"    "os/exec")// Ugly hack, this is bufio.ScanLines with ? added as an other delimiter :Dfunc new_scanner(data []byte, atEOF bool) (advance int, token []byte, err error) {    if atEOF && len(data) == 0 {        return 0, nil, nil    }    if i := bytes.IndexByte(data, 'n'); i >= 0 {        // We have a full newline-terminated line.        fmt.Printf("nnn")        return i + 1, data[0:i], nil    }    if i := bytes.IndexByte(data, '?'); i >= 0 {        // We have a full ?-terminated line.        return i + 1, data[0:i], nil    }    // If we're at EOF, we have a final, non-terminated line. Return it.    if atEOF {        return len(data), data, nil    }    // Request more data.    return 0, nil, nil}func main() {    cmd := exec.Command("rm", "-i", "somefile.txt")    // Stdout + stderr    out, err := cmd.StderrPipe() // Again, rm writes prompts to stderr    if err != nil {        log.Fatal(err)    }    scanner := bufio.NewScanner(out)    scanner.Split(new_scanner)    // Stdin    in, err := cmd.StdinPipe()    if err != nil {        log.Fatal(err)    }    defer in.Close()    // Start the command!    err = cmd.Start()    if err != nil {        log.Fatal(err)    }    // Start scanning    for scanner.Scan() {        line := scanner.Text()        if line == "rm: remove regular empty file ‘somefile.txt’" { in.Write([]byte("yn"))        }    }    // Report scanner's errors    if err := scanner.Err(); err != nil {        log.Fatal(err)    }    // program completes normally...s}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507022.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号