Windows Ubuntu Bash için Windows yolunu dönüştürme


31

Windows Ubuntu Bash kullanan bir Windows toplu komut dosyası var. Bağımsız değişken olarak tam bir Windows yolu alır ve bu yolu Ubuntu Bash'teki bir komuta iletir.

@echo off
bash -lic 'ffmpeg -i "%1" output.avi'

İşte "%1"tam Windows yolu,"C:\some path\file.avi"

Komut hatayı verir:

C:some pathfile.avi: Protocol not found

Bu Windows yolunun /mnt/c/some\ path/file.aviWindows Bash'ın gerçekten anlayacağı bir yola dönüşmesini sağlamak için ne yapabilirim ?


Ne tüm tekrarlarını yerini alıyor ihtiyaç C:ile /mnt/c(potansiyel olarak çok diğer sürücü harfleri için), doğru mu?
kleinfreund

Yanıtlar:


41

Windows Build 17046 [1] , wslpathyolları WSL / Windows'tan / WSL / Windows'a çevirebilen yeni bir yardımcı program içerir . Bu WSL özelliğinin eksik olduğu biliniyordu. [2]

Örnek kullanım:

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

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

wslpathWindows'ta Powershell'den arayabilirsiniz :

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

wslpath seçenekler ve parametreler:

-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
Daha eski Windows sürümleri için: github.com/laurent22/wslpath
Warlike Şempanze

1
posh '\' kaçmak gerekiyor, ama wsl değil. örnek $ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'olmalıdır olmalıdır $ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'Kaçan zaman çalışır, ama yararsız kaçış kafa karıştırıcı. Kişi kaçması gerektiğini varsayabilir. Ayrıca, bence üzerinde açıklama -m, ... with ‘/’ instead of ‘\\’'\' biri olmalıdır (Biliyorum en kopyalanıp yapıştırılan) Bunu yaparsanız wslpath -w /mnt/c/Users, bu \\ 'iki yazdırmıyor
papo

1
Ben inanıyorum wslpatholan kısım cevap, ama bu mesaj fonksiyonel soruya cevap vermez inanıyoruz - Bir toplu iş dosyası Windows tarzı (sahip olduğunda, sorar C:\foo\bar\blahbir WSL komutunu de çalışır nasıl bir veri dosyası için) adını bu dosya?
Scott

@papo Kullanımları kesik eğik çizgilerle ilgili bir sorun üzerinde tökezledim: tutarsız ve nasıl çalıştığına bağlı, powershell'den çalıştırıldığında sadece kaçışsız eğik çizgileri atlıyor, bash'den çalıştırıldığında onlara sadece bir dize içinde doğru davranıyor.
Sukhmel

@sukhmel true, wsl'de (windows için bash'ın çalıştığı) ve ayrıca cmd konsolunda, tek veya çift tırnak içine yol koy veya \\ olarak kaçış Tırnakların içine kaçmanın hızlı bir yolu var: cat `wslpath 'sonra sürükleyip bırak konsola dosya ve çizgi bitirmek:'`
papo

5

Bunu yapmak için bir yarasa dosyası yazdım. Dosyayı çalıştığınız yere yerleştirin veya yolunuza ekleyin (veya yalnızca kodunuzun üzerine koyun, bu da çalışmak daha kolay olacaktır). Önce dosya yolunuza "değişken" atamayı unutmayın (ayrı bir dosya kullanıyorsanız parametreleri kullanmayı deneyin).

Kod ne yapar:

1) Sürücü olan yolun ilk harfini alın.

2) İlk iki harfi kaldırın.

3) Eğik çizgileri değiştirin.

4) Bu zor kısmı: Linux büyük / küçük harfe duyarlı olduğundan, büyük harf sürücü harfini küçük harfe dönüştürmeliyiz. Bunu her birini eşleştirerek yap (daha iyi bir yol olup olmadığını söyle). Muhtemelen ondan fazla sürücünüz olmadığı için gereksiz sürücü harflerini de kaldırabilirsiniz.

5) Son dizeyi vermek için her şeyi birleştirin.

Sonuç:

Giriş:

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

Çıktı (tırnak işaretleri ile):

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

Kod aşağıdaki gibidir:

@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

Tersine, bir Unix yolunu kabuk betiğindeki bir Windows yoluna dönüştürmeye ne dersiniz?
JacobTheDev

@JacobTheDev, bunun için sadece küçük değişikliklere ihtiyacınız olacak;)
PulseJet


0

Neden bu kadar karmaşık?

Kayıt defteri girdisini değiştirme

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

itibaren

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

için

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

Wslpath'ten önce ve sonunda backsticks kullanın ve% 1 civarında tek tırnak işareti (düz keneler) kullanın.

Benim için çalışıyor.


Gerçekten mi? Bu bash, bir toplu iş dosyasından çağrılan sorudaki sorunu çözer ? (Örnekte, bash'ın ilk argümanı olduğunu -lic, bu yüzden nasıl wslpath '%1'çalışacağımı net değil .) Ve neden çift tırnak ( "%1") 'dan tek tırnak ( '%1') olarak değiştirdiniz?
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.