在下面的代码中,我设置了一个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
答案 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"