Converter caminho do Windows para o Windows Ubuntu Bash

14

Eu tenho um script em lotes do Windows que usa o Windows Ubuntu Bash. Ele recebe um caminho completo do Windows como um argumento e, em seguida, passa esse caminho para um comando no Ubuntu Bash.

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

Aqui "%1" é o caminho completo do Windows, como "C:\some path\file.avi"

O comando dá o erro:

C:some pathfile.avi: Protocol not found

O que posso fazer para que esse caminho do Windows seja convertido em um caminho como /mnt/c/some\ path/file.avi , que o Bash do Windows realmente entenderia?

    
por laggingreflex 14.08.2016 / 12:01

2 respostas

14

O Windows Build 17046 [1] contém o novo utilitário wslpath que pode traduzir caminhos de / para o WSL / Windows. Isso era conhecido como recurso WSL ausente. [2]

Exemplo de uso:

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

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

Você pode chamar wslpath do Powershell no Windows:

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

wslpath opções e parâmetros:

-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 ‘\’
    
por 25.04.2018 / 16:13
5

Eu escrevi um arquivo bat para fazer isso. Basta colocar o arquivo onde você estiver trabalhando ou adicioná-lo ao seu caminho (ou apenas colocá-lo acima do seu código, o que seria mais fácil de se trabalhar). Lembre-se de atribuir "variável" ao seu caminho de arquivo primeiro (se você estiver usando um arquivo separado, tente usar parâmetros).

O que o código faz:

1) Pegue a primeira letra do caminho, que é a unidade.

2) Remova as duas primeiras letras.

3) Altere as barras.

4) Essa é a parte complicada: como o Linux faz distinção entre maiúsculas e minúsculas, precisamos converter letras maiúsculas em minúsculas. Faça isso combinando cada um (diga-me se existe uma maneira melhor). Você também pode remover letras de unidade desnecessárias, pois provavelmente você não tem mais do que dez unidades.

5) Combine tudo para dar a string final.

O resultado:

Entrada:

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

Saída (com as aspas):

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

O código é o seguinte:

@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
    
por 15.08.2016 / 20:56