2016-07-01 4 views
-1

In Windows cmd Konsole, wenn ich den Echo-Befehl verwenden:golang Wie kann man doppelte Anführungszeichen richtig verwenden?

echo abc  //get: abc 
echo "abc //get: "abc 
echo "abc" //get: "abc" 

Dann ist es in go Sprache mit dem exec-Paket Ich mag laufen

package main 

import (
    "fmt" 
    "os/exec" 
) 

func main() { 
    cmd1 := "echo abc def" 
    cmd2 := "echo abc\"edf" 
    cmd3 := `echo abc"edf` 
    cmd4 := `echo abc\"edf` 
    cmd5 := "echo abcedf你好" 
    fo(cmd1) 
    fo(cmd2) 
    fo(cmd3) 
    fo(cmd4) 
    fo(cmd5) 
} 

func fo(command string) { 
    cmd := exec.Command("cmd", "/C", command) 
    out, _ := cmd.Output() 
    fmt.Printf("%s => %s\n", command, string(out)) 
} 

ich

echo abc def => abc def 
echo abc"edf => abc\"edf 
echo abc"edf => abc\"edf 
echo abc\"edf => abc\\\"edf 
echo abcedf你好 => abc??edf���� 

Wie Sie sehen können, ist keiner von ihnen (außer Cmd1) richtig. Auch utf-8 wird nicht korrekt angezeigt. Ich möchte nicht den Back-Slash in Ausgabe (ich glaube das Problem ist tatsächlich in der Eingabe nicht ausgegeben, siehe unten)

Ich kann nicht einfach etwas auf das Ergebnis (dh entfernen Schrägstrich von Ergebnis), weil es nicht funktioniert für komplexe Situationen. Zum Beispiel möchte ich

cmd /c start "echo abc & echo def" 

ich nicht doppelte Anführungszeichen entfernen, sonst wird der letzte Teil läuft im aktuellen Fenster, nicht das Startfenster laufen. Dann in gehen, unter Codes funktioniert nicht:

cmd6 := "cmd /c start \"echo abc & echo def\"" 
fo(cmd6) 

Wie man es in Golang arbeiten lassen?

+1

Ich fürchte, das ist ein Fall des [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Welches Problem versuchen Sie zu lösen? Geht es darum, UTF-8-Strings auf der Konsole zu drucken oder ein Programm mit komplexen Befehlszeilenargumenten auszuführen? Ich frage, weil Sie ein künstliches Beispiel ohne klare (für mich) Ziele und eine strittige Frage präsentieren, also während ich etwas über Go und die Windows-Konsole weiß und andere Programme von Go aus laufe, habe ich keine Ahnung was * Problem * eigentlich ansprechen. Bitte sei klarer. – kostix

+0

Danke. Es scheint so. Ich möchte cmd6 ausführen, aber mit Fehlern. Dann brach ich zusammen, um die einfachere cmd1 ~ cmd5 zu testen, und fand, dass cmd2 ~ cmd5 auch nicht funktionierte. Vergib mir, wenn sie nicht das gleiche Problem waren. Mein ultimatives Ziel ist es, jede Dos-Konsole fehlerfrei laufen zu lassen (die gleiche Eingabe führt zu der gleichen Ausgabe oder Aktion zwischen DOS und GO), die alle cmd1 ~ cmd6 benötigt, sollte genau wie DOS-Konsole laufen. – qing6010

Antwort

1

Wie wäre es direkt mit Echo?

package main 

import (
    "fmt" 
    "os/exec" 
) 

func main() { 
    cmd1 := "abc def" 
    cmd2 := "abc\"edf" 
    cmd3 := `abc"edf` 
    cmd4 := `abc\"edf` 
    cmd5 := "abcedf你好" 
    cmd6 := "abc & echo def" 
    fo(cmd1) 
    fo(cmd2) 
    fo(cmd3) 
    fo(cmd4) 
    fo(cmd5) 
    fo(cmd6) 
} 

func fo(command string) { 
    cmd := exec.Command("echo", command) 
    out, _ := cmd.Output() 
    fmt.Printf("%s => %s\n", command, string(out)) 
} 
+0

Hallo danke. Ich betreibe dies auf meinem Linux, sie sind in Ordnung. Aber in Windows scheint keine Ausgabe nach jedem "=>". Ich führe Windows 10.0.10586 aus. Hast du es in Fenstern passiert? – qing6010

+0

Ich lief sie auf dem Mac. –

Verwandte Themen