Windows Ubuntu Bash에 대한 Windows 경로 변환 스크립트가 있습니다. 인수로

Windows Ubuntu Bash를 사용하는 Windows 배치 스크립트가 있습니다. 인수로 전체 Windows 경로를 수신 한 다음 해당 경로를 Ubuntu Bash의 명령으로 전달합니다.

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

다음 "%1"은 전체 Windows 경로입니다."C:\some path\file.avi"

명령은 오류를 제공합니다.

C:some pathfile.avi: Protocol not found

이 Windows 경로를 /mnt/c/some\ path/file.aviWindows Bash가 실제로 이해할 수있는 경로로 변환하려면 어떻게해야합니까?



답변

Windows Build 17046 [1] 에는 wslpathWSL / Windows 와의 경로를 변환 할 수있는 새로운 유틸리티가 포함되어 있습니다 . 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

wslpathWindows의 Powershell에서 전화 할 수 있습니다 .

>>> 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) 경로의 첫 글자 인 드라이브를 가져옵니다.

2) 처음 두 글자를 제거하십시오.

3) 슬래시를 변경하십시오.

4) 이것은 까다로운 부분입니다. Linux는 대소 문자를 구분하므로 대문자 드라이브 문자를 소문자로 변환해야합니다. 각각을 일치시킴으로써이를 수행하십시오 (더 나은 방법이 있으면 알려주십시오). 드라이브가 10 개를 초과하지 않기 때문에 불필요한 드라이브 문자도 제거 할 수 있습니다.

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

답변

왜 그렇게 복잡한가?

레지스트리 항목 변경

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

…에서

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

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

wslpath 앞과 끝에 백틱을 사용하고 % 1 주위에 작은 따옴표 (직선 틱)를 사용하십시오.

나를 위해 작동합니다.