Saya memiliki skrip batch Windows yang menggunakan Windows Ubuntu Bash. Itu menerima path Windows penuh sebagai argumen dan kemudian melewati path itu ke perintah di Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Berikut "%1"
adalah jalur Windows lengkap, seperti"C:\some path\file.avi"
Perintah memberikan kesalahan:
C:some pathfile.avi: Protocol not found
Apa yang bisa saya lakukan untuk mengubah jalur Windows ini menjadi jalur /mnt/c/some\ path/file.avi
yang benar-benar dimengerti oleh Windows Bash?
windows-subsystem-for-linux
laggingreflex
sumber
sumber
C:
dengan/mnt/c
(berpotensi untuk huruf drive lain juga), kan?Jawaban:
Windows Build 17046 [1] berisi
wslpath
utilitas baru yang dapat menerjemahkan jalur dari / ke WSL / Windows. Ini dikenal sebagai fitur WSL yang hilang. [2]Contoh penggunaan:
Anda dapat menelepon
wslpath
dari Powershell di Windows:wslpath
opsi dan parameter:sumber
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
seharusnya$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
bekerja ketika melarikan diri, tetapi melarikan diri yang tidak berguna membingungkan. Orang bisa berasumsi itu harus diloloskan. Juga, saya pikir deskripsi pada-m
,... with ‘/’ instead of ‘\\’
harus memiliki satu '\' (Saya tahu itu disalin) Jika Anda melakukannyawslpath -w /mnt/c/Users
, itu tidak mencetak dua '\\'wslpath
adalah bagian dari jawaban, tapi saya percaya bahwa posting ini tidak secara fungsional menjawab pertanyaan - yang menanyakan, ketika file batch memiliki nama Windows-style (C:\foo\bar\blah
) untuk file data, bagaimana cara menjalankan perintah WSL pada file itu?cat `wslpath '
kemudian seret & lepas a file ke konsol dan menyelesaikan garis:'`
Saya menulis file kelelawar untuk melakukan ini. Cukup tempatkan file di mana pun Anda bekerja atau tambahkan ke jalur Anda (atau cukup letakkan di atas kode Anda, yang akan lebih mudah untuk dikerjakan). Ingat untuk menetapkan "variabel" ke jalur file Anda terlebih dahulu (jika Anda menggunakan file terpisah, coba gunakan parameter).
Apa yang dilakukan kode:
1) Dapatkan huruf pertama dari path, yang merupakan drive.
2) Hapus dua huruf pertama.
3) Ubah garis miring.
4) Ini bagian yang sulit: karena Linux peka terhadap huruf besar-kecil, kita perlu mengubah huruf drive huruf besar menjadi huruf kecil. Lakukan ini dengan mencocokkan masing-masing (beri tahu saya jika ada cara yang lebih baik). Anda juga dapat menghapus huruf drive yang tidak perlu, karena Anda mungkin tidak memiliki lebih dari sepuluh drive.
5) Gabungkan semuanya untuk memberikan string terakhir.
Hasil:
Memasukkan:
Output (dengan tanda kutip):
Kode tersebut adalah sebagai berikut:
sumber
Kenapa begitu rumit?
Ubah entri registri
dari
untuk
Gunakan backtick sebelum wslpath dan di akhir, dan gunakan tanda kutip tunggal (kutu lurus) sekitar% 1.
Bekerja untukku.
sumber
bash
dipanggil dari file batch? (Perhatikan bahwa, dalam contoh, argumen pertama bash adalah-lic
, jadi tidak jelas bagi saya bagaimana carawslpath '%1'
kerjanya.) Dan mengapa Anda mengubah dari tanda kutip ganda ("%1"
) menjadi tanda kutip tunggal ('%1'
)?