উইন্ডোজ উবুন্টু বাশের জন্য উইন্ডোজ পাথ রূপান্তর করুন


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যা উইন্ডোজ বাশ আসলে বুঝতে পারে?


আপনার কি কি প্রয়োজন সব occurences প্রতিস্থাপন করা হয় C:সঙ্গে /mnt/c(সম্ভাব্য অন্যান্য ড্রাইভ বর্ণ, খুব জন্য), ডান?
ক্লিনফ্রেন্ড

উত্তর:


41

উইন্ডোজ বিল্ড 17046 [1] এ নতুন wslpathইউটিলিটি রয়েছে যা ডাব্লুএসএল / উইন্ডোজ থেকে / থেকে পাথ অনুবাদ করতে পারে। এটি ডাব্লুএসএল বৈশিষ্ট্য অনুপস্থিত ছিল। [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
পোশের '\' অব্যাহতি প্রয়োজন, তবে ডাব্লুএসএল নয়। আপনার উদাহরণটি $ 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 কমান্ডটি প্রয়োগ নেই জন্য) নাম ফাইল?
স্কট

@ পাপো আমি স্রেফ ইউজক্যাপড স্ল্যাশ নিয়ে কোন সমস্যায় পড়ে গিয়েছি: এটি অসঙ্গত এবং এটি কীভাবে চালানো হয় তার উপর নির্ভর করে, যখন পাওয়ারশেল থেকে চালানো হয় কেবল অনস্ক্র্যাপড স্ল্যাশ বাদ দেয়, যখন বাশ থেকে চালানো হয় কেবল স্ট্রিংয়ের ভিতরেই এটি সঠিকভাবে আচরণ করে।
সুখমেল

@ সুখমেল সত্য, ডাব্লুএসএলতে (উইন্ডোজের জন্য ব্যাশ চলমান) এবং সেমিডি কনসোলে, হয় একক বা ডাবল উদ্ধৃতিগুলিতে পথ রাখুন, বা এই রূপে অব্যাহতি দিন inside উদ্ধৃতিগুলির মধ্যে পলায়নের অযোগ্যতা দ্রুত করার প্রস্তাব দেয়: cat `wslpath 'তারপরে একটি টেনে আনুন এবং ফেলে দিন কনসোলে ফাইল করুন এবং লাইনটি শেষ করুন:'`
পাপো

5

এটি করার জন্য আমি একটি ব্যাটের ফাইল লিখেছি। আপনি যেখানে কাজ করছেন সেখানে কেবল ফাইলটি রাখুন বা এটি আপনার পথে যুক্ত করুন (বা কেবল এটি আপনার কোডের উপরে রাখুন, যা দিয়ে কাজ করা আরও সহজ হবে)। প্রথমে আপনার ফাইলের পথে "ভেরিয়েবল" বরাদ্দ করতে ভুলবেন না (যদি আপনি একটি পৃথক ফাইল ব্যবহার করেন তবে পরামিতিগুলি ব্যবহার করে দেখুন)।

কোডটি কী করে:

1) পথের প্রথম চিঠিটি পান, যা ড্রাইভ।

2) প্রথম দুটি অক্ষর সরান।

3) স্ল্যাশ পরিবর্তন করুন।

৪) এটি একটি জটিল অংশ: লিনাক্স যেহেতু কেস সংবেদনশীল তাই আমাদের বড় ড্রাইভ লেটারকে ছোট হাতের মধ্যে রূপান্তর করতে হবে। প্রতিটি মিলিয়ে এটি করুন (আরও ভাল উপায় আছে কিনা আমাকে বলুন)। আপনি অযথা ড্রাইভের অক্ষরও মুছে ফেলতে পারেন, যেহেতু আপনার কাছে সম্ভবত দশটি ড্রাইভ নেই।

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

বিপরীতটি সম্পর্কে কী, ইউনিক্সের পাথাকে শেল স্ক্রিপ্টে উইন্ডোজ পাথে রূপান্তর করা?
জ্যাকবডেদেভ

@ জ্যাকবডেদেভ, আপনার জন্য কেবলমাত্র সামান্য পরিবর্তন প্রয়োজন হবে;)
পালস জেট


0

এত জটিল কেন?

রেজিস্ট্রি এন্ট্রি পরিবর্তন করুন

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

থেকে

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

প্রতি

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

ডাব্লুএসপ্যাথের আগে এবং শেষে ব্যাকটিকগুলি ব্যবহার করুন এবং একক উদ্ধৃতি চিহ্ন (স্ট্রেট টিক্স) প্রায়% 1 ব্যবহার করুন।

আমার জন্য কাজ কর.


সত্যি? এটি প্রশ্নটিতে সমস্যা সমাধান করে, bashব্যাচের ফাইল থেকে কোথা থেকে ডাকা হয়? (দ্রষ্টব্য, উদাহরণস্বরূপ, বাশের প্রথম যুক্তিটি হ'ল -licএটি কীভাবে wslpath '%1'কাজ করবে তা আমার কাছে পরিষ্কার নয় And এবং কেন আপনি ডাবল উদ্ধৃতি ( "%1") থেকে একক উদ্ধৃতিতে পরিবর্তন করেছেন '%1')?
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.