2016-04-21 13 views
2

Ich möchte die Datei öffnen zwei Leerzeichen mit Explorer von Go exec.Command() enthalten.Failed exec.Command mit Dateiname enthalten zwei Leerzeichen

Dieser Befehl funktioniert wie erwartet von Windows PowerShell.

Explorer "file://C:\Users\1. Sample\2. Sample2" 

Und Gos Mit exec.Command() Arbeiten mit dem Dateinamen enthalten Raum wie diese.

exec.Command(`explorer`, "file://C:\Users\1. Sample").CombinedOutput() 

aber nicht mit dem Dateinamen enthalten zwei Räume wie diese

exec.Command(`explorer`, "file://C:\Users\1. Sample\2. Sample2").CombinedOutput() 

Bitte sagen Sie mir, wie diese zu lösen.


Dieser Code funktioniert wie erwartet. Vielen Dank.

Aber tatsächliche Eingabe ist Zeichenfolge (nicht Raw String Literal) wie unten. Also ich denke, dass ich String zu Raw String konvertieren muss.

url := "file://C:\Users\1. Sample\2. Sample2" 

     <I need to convert to raw string literal?> 

result, err := exec.Command(`explorer`, url).CombinedOutput() 

if err != nil { 
    log.Fatal(err) 
} 

Antwort

3

2 Leerzeichen in Dateinamen haben nichts damit zu tun, dass der Befehl nicht ausgeführt wird.

Sie verwenden interpreted string literals:

"file://C:\Users\1. Sample\2. Sample2" 

In interpretiert Stringliterale der umgekehrten Schrägstrich \ besondere ist, und wenn Sie möchten, dass Ihre string einen umgekehrten Schrägstrich haben, müssen Sie es entkommen, und die Escape-Sequenz 2 backslahses \\:

"file://C:\\Users\\1. Sample\\2. Sample2" 

Oder noch besser: verwenden Sie raw string literals (und dann brauchen Sie es nicht zu entkommen):

Das seltsame Zeichen in Ihrem Dateinamen kann auch ein Problem verursachen. Wenn Sie das in Go-Quellcode einschließen, wird es als UTF-8-Zeichenfolge interpretiert und codiert. Sie übergeben dies als Parameter, aber Ihr Betriebssystem (Windows) verwendet beim Überprüfen von Dateinamen möglicherweise eine andere Zeichencodierung, sodass es möglicherweise nicht gefunden wird. Entfernen Sie das seltsame Zeichen aus dem Dateinamen, wenn das Korrigieren des Zeichenfolgenliterals nicht ausreicht, damit es funktioniert.

Wenn Sie den Befehl von PowerShell ausführen, funktioniert dies, weil PowerShell keine interpretierte Zeichenfolge erwartet und die Codierung verwendet, die auch zum Speichern von Dateinamen verwendet wird.

Auch Cmd.CombinedOutput() (wie Cmd.Run() und Cmd.Start()) geben eine error, sicher sein, dass zu überprüfen, wie es zusätzliche Informationen liefern.

+0

Sollte bei der Windows-Syscall-Konvertierung die Codierung nicht korrekt ausgeführt werden? – bgeyts668

+0

Haben Sie Vorschläge? – gaku

+0

@gaku Ja, benutze ein rohe String-Literal und entferne seltsame Zeichen aus dem Dateinamen. Diese werden in der Antwort erwähnt. – icza

Verwandte Themen