从Golang应用发送字符串时出现意外的StrComp结果

时间:2018-09-27 17:21:56

标签: go vbscript

在下面的代码中,我设置了一个ReadString,它可以读取用户输入并将其传递到exec.Command中。

这很好,但是当我尝试将字符串与vbscript中的硬编码字符串进行比较(在这种情况下,我将其与“ hello”进行比较)时,即使用户输入也是“ hello”,它也总是会失败

但是,如果我只是通过这样的命令行运行vbscript ...

 cscript.exe script.vbs hello

...然后StrComp可以按预期工作,因此我怀疑这是数据类型问题,还是golang应用程序中传递了一些额外的字符。

这是 main.go

package main

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

func main() {

    buf := bufio.NewReader(os.Stdin)

    fmt.Print("Type something: ")
    text, err := buf.ReadString('\n')
    if err != nil {
        fmt.Println(err)
    } else {
        args := []string{"./script.vbs", string(text)}
        exec.Command("cscript.exe", args...).Run()
    }
}

这是 script.vbs

MsgBox(WScript.Arguments(0))

If StrComp(WScript.Arguments(0), "hello") = 0 Then
    MsgBox("it's the same")
Else
    MsgBox("It's not the same...")
End If

1 个答案:

答案 0 :(得分:1)

使用Windows时,行尾为“ \ r \ n”。我不知道ReadString()是否应删除定界符,但即使这样,文本仍将包含不可见的\ r。使用strings.TrimSpace在保存侧:

package main

import (
    "fmt"
    "os/exec"
    "bufio"
    "os"
    "strings"
)

func main() {

    buf := bufio.NewReader(os.Stdin)

    fmt.Print("Type something: ")
    text, err := buf.ReadString('\n')
    fmt.Printf("0 got: %T %v %q\r\n", text, text, text)
    text = strings.TrimSpace(text)
    fmt.Printf("1 got: %T %v %q", text, text, text)
    if err != nil {
        fmt.Println(err)
    } else {
        args := []string{"./script.vbs", string(text)}
        exec.Command("cscript.exe", args...).Run()
    }
}

(主要的输出;将您的想象力用于VBScript MsgBoxes):

main
Type something: hello
0 got: string hello
 "hello\r\n"
1 got: string hello "hello"