विंडोज उबंटू बैश के लिए विंडोज पथ परिवर्तित करें


32

मेरे पास एक विंडोज़ बैच स्क्रिप्ट है जो विंडोज उबंटू बैश का उपयोग करती है। यह एक तर्क के रूप में एक पूर्ण विंडोज पथ प्राप्त करता है और फिर उस मार्ग को उबंटू बैश में एक कमांड में भेजता है।

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

यहाँ "%1"पूर्ण विंडोज पथ है, जैसे"C:\some path\file.avi"

आदेश त्रुटि देता है:

C:some pathfile.avi: Protocol not found

मैं इस विंडोज पथ को ऐसे पथ में परिवर्तित करने के लिए क्या कर सकता हूं जैसे /mnt/c/some\ path/file.aviकि विंडोज बैश वास्तव में समझ में आएगा?


क्या आप की जरूरत है के C:साथ सभी घटनाओं की जगह ले रहा है /mnt/c(संभवतः अन्य ड्राइव पत्र के लिए, भी), सही?
क्लाइनफ्रेन्ड

जवाबों:


41

विंडोज बिल्ड 17046 [1] में नई wslpathउपयोगिता है जो डब्ल्यूएसएल / विंडोज से / तक पथों का अनुवाद कर सकती है। यह गुम WSL सुविधा के रूप में जाना जाता था। [2]

उदाहरण का उपयोग:

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

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

आप wslpathविंडोज पर पॉवर्सशेल से कॉल कर सकते हैं :

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

wslpath विकल्प और पैरामीटर:

-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
पुराने विंडोज के लिए, यहाँ उपलब्ध है: github.com/laurent22/wslpath
वारिम चिंपांजी

1
पॉश को '' भागने की जरूरत है, लेकिन wsl नहीं। आपका उदाहरण यह $ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'होना चाहिए कि $ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'जब वह बच जाए तो काम करे, लेकिन बेकार बचना भ्रम की स्थिति है। कोई यह मान सकता है कि उसे बच जाना चाहिए। इसके अलावा, मुझे लगता है कि पर वर्णन -m, ... with ‘/’ instead of ‘\\’एक होना चाहिए '\' (मैं जानता हूँ कि यह प्रतिलिपि चिपकाया) यदि आप करते हैं wslpath -w /mnt/c/Users, यह दो मुद्रित नहीं करता है '\\'
इनके

1
मुझे विश्वास है कि wslpathयह उत्तर का हिस्सा है, लेकिन मेरा मानना ​​है कि यह पोस्ट कार्यात्मक रूप से प्रश्न का उत्तर नहीं देता है - जो पूछता है, जब एक बैच फ़ाइल में C:\foo\bar\blahडेटा फ़ाइल के लिए विंडोज-शैली ( ) नाम है, तो यह WSL कमांड को कैसे चलाता है वह फाइल?
स्कॉट

@papo मैं अभी तक उपयोग किए गए स्लैश के साथ एक समस्या पर ठोकर खाई है: यह असंगत है और यह कैसे चलाया जाता है, इस पर निर्भर करता है, जब पावरशेल से चलाया जाता है तो यह बिना छीले हुए स्लैश को छोड़ देता है, जब बैश से चलाते हैं तो यह केवल एक स्ट्रिंग के अंदर उन्हें सही ढंग से व्यवहार करता है।
सुखमेल

@sukmel true, wsl में (जिस पर windows रन के लिए bash होता है) और cmd कंसोल में भी या तो सिंगल या डबल कोट्स में पाथ रखा जाता है, या \\ के रूप में बच जाता है। उद्धरणों के अंदर भागने की अनैच्छिकता करने का एक तेज़ तरीका प्रदान करता है, cat `wslpath 'फिर ड्रैग एंड ड्रॉप a कंसोल में फाइल करें और लाइन खत्म करें:'`
papo

5

मैंने ऐसा करने के लिए एक बैट फाइल लिखी। फ़ाइल को जहाँ भी आप काम कर रहे हैं या अपने पथ में जोड़ें (या बस अपने कोड के ऊपर रखें, जिससे काम करना आसान होगा)। पहले अपने फ़ाइल पथ पर "चर" असाइन करना याद रखें (यदि आप एक अलग फ़ाइल का उपयोग कर रहे हैं, तो मापदंडों का उपयोग करके देखें)।

कोड क्या करता है:

1) पथ का पहला अक्षर प्राप्त करें, जो ड्राइव है।

2) पहले दो अक्षर निकालें।

3) स्लैश बदलें।

4) यह मुश्किल हिस्सा है: चूंकि लिनक्स संवेदनशील है, इसलिए हमें अपरकेस ड्राइव लेटर को लोअरकेस में बदलना होगा। प्रत्येक को मेल करके ऐसा करें (बेहतर तरीका है तो मुझे बताएं)। आप अनावश्यक ड्राइव अक्षर भी हटा सकते हैं, क्योंकि आपके पास संभवतः दस से अधिक ड्राइव नहीं हैं।

5) अंतिम स्ट्रिंग देने के लिए सब कुछ मिलाएं।

परिणाम:

इनपुट:

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

आउटपुट (उद्धरण चिह्नों के साथ):

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

कोड निम्नानुसार है:

@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

शेल स्क्रिप्ट में एक यूनिक्स पथ को विंडोज पथ में परिवर्तित करने, रिवर्स के बारे में क्या?
याकूबTheDev

@JacobTheDev, आपको इसके लिए केवल थोड़े से संशोधनों की आवश्यकता होगी;)
पल्स जेट

वास्तव में यह आज सुबह पता चला! gist.github.com/JacobDB/e71e22c3663175b2369211aeb54362fe
JacobTheDev

0

इतना जटिल क्यों?

रजिस्ट्री प्रविष्टि बदलें

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

से

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

सेवा

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

Wslpath से पहले और अंत में backticks का उपयोग करें, और% 1 के आसपास एकल उद्धरण चिह्नों (सीधे टिक) का उपयोग करें।

मेरे लिये कार्य करता है।


वास्तव में? यह प्रश्न में समस्या को हल करता है, जहां bashएक बैच फ़ाइल कहा जाता है? (ध्यान दें, उदाहरण के लिए, बैश का पहला तर्क है -lic, इसलिए यह मेरे लिए स्पष्ट नहीं है कि wslpath '%1'काम कैसे हो रहा है।) और आपने दोहरे उद्धरण ( "%1") से एकल उद्धरण ( '%1') में क्यों बदला है ?
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.