Mam skrypt wsadowy systemu Windows korzystający z systemu Windows Ubuntu Bash. Otrzymuje pełną ścieżkę systemu Windows jako argument, a następnie przekazuje tę ścieżkę do polecenia w Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Oto "%1"
pełna ścieżka systemu Windows"C:\some path\file.avi"
Polecenie podaje błąd:
C:some pathfile.avi: Protocol not found
Co mogę zrobić, aby ta ścieżka systemu Windows została przekonwertowana na ścieżkę podobną do tej, /mnt/c/some\ path/file.avi
którą program Windows Bash faktycznie zrozumiałby?
windows-subsystem-for-linux
laggingreflex
źródło
źródło
C:
z/mnt/c
(potencjalnie dla innych liter dysków, zbyt), prawda?Odpowiedzi:
Kompilacja systemu Windows 17046 [1] zawiera nowe
wslpath
narzędzie, które może tłumaczyć ścieżki z / na WSL / Windows. To była znana brakująca funkcja WSL. [2]Przykładowe użycie:
Możesz zadzwonić
wslpath
z programu Powershell w systemie Windows:wslpath
opcje i parametry:źródło
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
powinno być$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
To działa, gdy uciekasz, ale bezużyteczne uciekanie jest mylące. Można przypuszczać, że trzeba uciec. Także myślę, że na opis-m
,... with ‘/’ instead of ‘\\’
powinny mieć jeden „\” (wiem, że to kopia wklejony) Jeśli takwslpath -w /mnt/c/Users
, to nie drukuje dwa „\\”wslpath
jest to część odpowiedzi, ale wierzę, że ten post nie odpowiada funkcjonalnie na pytanie - które pyta, kiedy plik wsadowy maC:\foo\bar\blah
nazwę pliku danych w stylu Windows ( ), w jaki sposób uruchamia polecenie WSL na ten plik?cat `wslpath '
następnie przeciągnij i upuść plik do konsoli i dokończ linię:'`
Aby to zrobić, napisałem plik nietoperza. Po prostu umieść plik gdziekolwiek pracujesz lub dodaj go do swojej ścieżki (lub po prostu umieść go nad kodem, co byłoby łatwiejsze do pracy). Pamiętaj, aby najpierw przypisać „zmienną” do ścieżki pliku (jeśli używasz osobnego pliku, spróbuj użyć parametrów).
Co robi kod:
1) Uzyskaj pierwszą literę ścieżki, którą jest dysk.
2) Usuń pierwsze dwie litery.
3) Zmień ukośniki.
4) Jest to trudna część: ponieważ Linux rozróżnia małe i duże litery, musimy przekonwertować wielką literę dysku na małe litery. Zrób to, dopasowując każdy z nich (powiedz mi, czy jest lepszy sposób). Możesz także usunąć niepotrzebne litery dysków, ponieważ prawdopodobnie nie masz więcej niż dziesięć dysków.
5) Połącz wszystko, aby dać końcowy ciąg.
Wynik:
Wejście:
Dane wyjściowe (ze znakami cudzysłowu):
Kod jest następujący:
źródło
Dlaczego tak skomplikowane?
Zmień wpis rejestru
od
do
Użyj odwrotnych znaków przed wslpath i na końcu oraz użyj pojedynczych cudzysłowów (prostych tików) wokół% 1.
Pracuje dla mnie.
źródło
bash
jest wywoływany z pliku wsadowego? (Zauważ, że w tym przykładzie pierwszym argumentem bash jest-lic
, więc nie jest dla mnie jasne, jakwslpath '%1'
to będzie działać.) Dlaczego zmieniłeś z podwójnych cudzysłowów ("%1"
) na pojedyncze cudzysłowy ('%1'
)?