Konvertieren Sie den Windows-Pfad für Windows Ubuntu Bash


31

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.aviden Windows Bash tatsächlich versteht?


Was Sie brauchen, ist das Ersetzen aller Vorkommen C:durch /mnt/c(möglicherweise auch für andere Laufwerksbuchstaben), richtig?
Kleinfreund

Antworten:


41

Windows Build 17046 [1] enthält ein neues wslpathDienstprogramm, mit dem Pfade von / nach WSL / Windows übersetzt werden können. Hierfür fehlte bekanntermaßen die WSL-Funktion. [2]

Anwendungsbeispiel:

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
/mnt/c/aaa/bbb/ccc/foo.zip

Sie können wslpathvon Powershell unter Windows aus anrufen :

>>> wsl wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
/mnt/c/aaa/bbb/ccc/foo.zip

wslpath Optionen und Parameter:

-a    force result to absolute path format
-u    translate from a Windows path to a WSL path (default)
-w    translate from a WSL path to a Windows path
-m    translate from a WSL path to a Windows path, with ‘/’ instead of ‘\\’

1
Für ältere Windows, verfügbar hier: github.com/laurent22/wslpath
Warlike Chimpanzee

1
posh muss entkommen "\", aber wsl nicht. Ihr Beispiel $ 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 tun wslpath -w /mnt/c/Users, werden keine zwei '\\'
gedruckt

1
Ich glaube, das wslpathist 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?
Scott

@papo Ich bin gerade auf ein Problem mit usedcaped Slashes gestoßen: Es ist inkonsistent und hängt davon ab, wie es ausgeführt wird. Wenn es von Powershell ausgeführt wird, werden nicht hervorgehobene Slashes einfach weggelassen, wenn es von bash ausgeführt wird, werden sie nur innerhalb eines Strings korrekt behandelt.
Suchmel

@sukhmel wahr, in der WSL (auf dem bash für Windows läuft) und auch in cmd - Konsole entweder put Pfad in einfachen oder doppelten Anführungszeichen, oder Flucht als \\ The unneccesity in Anführungszeichen bieten eine schnelle Art und Weise zu entkommen tun: cat `wslpath 'dann per Drag & Drop eine Datei in die Konsole und beenden Sie die Zeile:'`
Papo

5

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:

E:\myfiles\app1\data\file.csv

Ausgabe (mit den Anführungszeichen):

"/mnt/e/myfiles/app1/data/file.csv"

Der Code lautet wie folgt:

@echo OFF

set "variable=E:\myfiles\app1\data\file.csv"

set "drive=%variable:~0,1%"

set variable=%variable:~2%
set "variable=%variable:\=/%"

if %drive%==A set "drive=a"
if %drive%==B set "drive=b"
if %drive%==C set "drive=c"
if %drive%==D set "drive=d"
if %drive%==E set "drive=e"
if %drive%==F set "drive=f"
if %drive%==G set "drive=g"
if %drive%==H set "drive=h"
if %drive%==I set "drive=i"
if %drive%==J set "drive=j"
if %drive%==K set "drive=k"
if %drive%==L set "drive=l"
if %drive%==M set "drive=m"
if %drive%==N set "drive=n"
if %drive%==O set "drive=o"
if %drive%==P set "drive=p"
if %drive%==Q set "drive=q"
if %drive%==R set "drive=r"
if %drive%==S set "drive=s"
if %drive%==T set "drive=t"
if %drive%==U set "drive=u"
if %drive%==V set "drive=v"
if %drive%==W set "drive=w"
if %drive%==X set "drive=x"
if %drive%==Y set "drive=y"
if %drive%==Z set "drive=z"

set "variable=/mnt/%drive%%variable%"

echo "%variable%"

@echo ON

Wie sieht es umgekehrt aus, wenn Sie einen Unix-Pfad in einem Shell-Skript in einen Windows-Pfad konvertieren?
JacobTheDev

@JacobTheDev, Sie müssten nur geringfügige Änderungen dafür;)
PulseJet


0

Warum so kompliziert?

Ändern Sie den Registrierungseintrag

HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command

von

C:\Windows\System32\wsl.exe "%1"

zu

C:\Windows\System32\wsl.exe `wslpath '%1'`

Verwenden Sie Backticks vor und am Ende von wslpath und einfache Anführungszeichen (gerade Häkchen) um% 1.

Funktioniert bei mir.


"Ja wirklich?" Dies löst das Problem in der Frage, wo bashaus einer Batch-Datei aufgerufen wird? (Beachten Sie, dass in diesem Beispiel das erste Argument von bash lautet -lic, daher ist mir nicht klar, wie wslpath '%1'es funktionieren soll.) Und warum haben Sie von doppelten Anführungszeichen ( "%1") zu einfachen Anführungszeichen ( '%1') gewechselt ?
Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.