Ich habe ein Windows-Batch-Skript, das Windows Ubuntu Bash verwendet. Es erhält einen vollständigen Windows-Pfad als Argument und übergibt diesen Pfad an einen Befehl in Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Hier "%1"
ist der vollständige Windows-Pfad"C:\some path\file.avi"
Der Befehl gibt den Fehler aus:
C:some pathfile.avi: Protocol not found
Was kann ich tun, damit dieser Windows-Pfad in einen Pfad konvertiert wird, /mnt/c/some\ path/file.avi
den Windows Bash tatsächlich versteht?
windows-subsystem-for-linux
laggingreflex
quelle
quelle
C:
durch/mnt/c
(möglicherweise auch für andere Laufwerksbuchstaben), richtig?Antworten:
Windows Build 17046 [1] enthält ein neues
wslpath
Dienstprogramm, mit dem Pfade von / nach WSL / Windows übersetzt werden können. Hierfür fehlte bekanntermaßen die WSL-Funktion. [2]Anwendungsbeispiel:
Sie können
wslpath
von Powershell unter Windows aus anrufen :wslpath
Optionen und Parameter:quelle
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
sollte sein.$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
Es funktioniert, wenn es entkommen ist, aber nutzloses Entkommen ist verwirrend. Man könnte annehmen, es muss geflüchtet werden. Außerdem, denke ich-m
,... with ‘/’ instead of ‘\\’
sollte die Beschreibung ein '\' haben (ich weiß, es ist kopiert). Wenn Sie dies tunwslpath -w /mnt/c/Users
, werden keine zwei '\\'wslpath
ist ein Teil der Antwort, aber ich glaube, dass dieser Beitrag die Frage nicht funktional beantwortet. Wenn eine Batchdatei einen Windows-ähnlichen (C:\foo\bar\blah
) Namen für eine Datendatei hat, wird gefragt , wie ein WSL-Befehl ausgeführt wird diese Datei?cat `wslpath '
dann per Drag & Drop eine Datei in die Konsole und beenden Sie die Zeile:'`
Ich habe dazu eine Fledermausdatei geschrieben. Platzieren Sie die Datei einfach an dem Ort, an dem Sie gerade arbeiten, oder fügen Sie sie Ihrem Pfad hinzu (oder platzieren Sie sie einfach über Ihrem Code, mit dem Sie leichter arbeiten können). Denken Sie daran, Ihrem Dateipfad zuerst "Variable" zuzuweisen (wenn Sie eine separate Datei verwenden, versuchen Sie, Parameter zu verwenden).
Was der Code macht:
1) Holen Sie sich den ersten Buchstaben des Pfades, der das Laufwerk ist.
2) Entfernen Sie die ersten beiden Buchstaben.
3) Ändern Sie die Schrägstriche.
4) Dies ist der schwierige Teil: Da Linux zwischen Groß- und Kleinschreibung unterscheidet, müssen wir den Großbuchstaben des Laufwerks in Kleinbuchstaben umwandeln. Tun Sie dies, indem Sie beide zusammenbringen (sagen Sie mir, ob es einen besseren Weg gibt). Sie können auch unnötige Laufwerksbuchstaben entfernen, da Sie wahrscheinlich nicht mehr als zehn Laufwerke haben.
5) Kombiniere alles, um die letzte Saite zu erhalten.
Das Ergebnis:
Eingang:
Ausgabe (mit den Anführungszeichen):
Der Code lautet wie folgt:
quelle
Warum so kompliziert?
Ändern Sie den Registrierungseintrag
von
zu
Verwenden Sie Backticks vor und am Ende von wslpath und einfache Anführungszeichen (gerade Häkchen) um% 1.
Funktioniert bei mir.
quelle
bash
aus einer Batch-Datei aufgerufen wird? (Beachten Sie, dass in diesem Beispiel das erste Argument von bash lautet-lic
, daher ist mir nicht klar, wiewslpath '%1'
es funktionieren soll.) Und warum haben Sie von doppelten Anführungszeichen ("%1"
) zu einfachen Anführungszeichen ('%1'
) gewechselt ?