Неожиданный результат StrComp при отправке строки из приложения golang - PullRequest
0 голосов
/ 27 сентября 2018

В моем коде ниже я настроил ReadString, который читает пользовательский ввод и передает его в exec.Command.

Это работает просто отлично, но когда я пытаюсь сравнить строку с жестко запрограммированной строкой в ​​vbscript (в этом случае я сравниваю ее с "привет"), она всегда завершается ошибкой, даже если пользовательский ввод "привет""также.

Если я просто запустлю 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 голосов
/ 27 сентября 2018

При работе с окнами окончание строки равно "\ 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...