72 votes

Convertir le chemin de Windows pour Windows Ubuntu Bash

J'ai un script batch Windows qui utilise le Bash de Windows Ubuntu. Il reçoit un chemin d'accès complet à Windows en tant qu'argument et transmet ensuite ce chemin à une commande dans Ubuntu Bash.

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

Ici "%1" est le chemin d'accès complet de Windows, comme "C:\some path\file.avi"

La commande donne l'erreur :

C:some pathfile.avi: Protocol not found

Que puis-je faire pour que ce chemin Windows soit converti en un chemin tel que /mnt/c/some\ path/file.avi que le Bash de Windows pourrait comprendre ?

104voto

Shank Mugen Points 170

Windows Build 17046 [1] contient de nouvelles wslpath utilitaire qui peut traduire les chemins de/vers WSL/Windows. C'était une fonctionnalité WSL manquante connue. [2]

Exemple d'utilisation :

$ echo $0
/bin/bash

$ which wslpath
/bin/wslpath

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

Vous pouvez appeler wslpath à partir de Powershell sur Windows :

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

wslpath options et paramètres :

-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 ‘\\’

7voto

pulsejet Points 2193

J'ai écrit un fichier bat pour faire cela. Il suffit de placer le fichier à l'endroit où vous travaillez ou de l'ajouter à votre chemin (ou simplement de le placer au-dessus de votre code, ce qui serait plus facile à travailler). N'oubliez pas d'assigner d'abord "variable" au chemin de votre fichier (si vous utilisez un fichier séparé, essayez d'utiliser les paramètres).

Ce que fait le code :

1) Obtenez la première lettre du chemin, qui est le lecteur.

2) Retirez les deux premières lettres.

3) Changez les barres obliques.

4) C'est la partie la plus délicate : puisque Linux est sensible à la casse, nous devons convertir les lettres majuscules en minuscules. Faites-le en faisant correspondre chaque lettre (dites-moi s'il y a une meilleure méthode). Vous pouvez également supprimer les lettres de lecteur inutiles, puisque vous n'avez probablement pas plus de dix lecteurs.

5) Combinez le tout pour obtenir la chaîne finale.

Le résultat :

Entrée :

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

Sortie (avec les guillemets) :

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

Le code est le suivant :

@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

5voto

Stefan Oskamp Points 31

Pourquoi si compliqué ?

Modifiez l'entrée du registre

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

de

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

a

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

Utilisez des guillemets avant wslpath et à la fin, et utilisez des guillemets simples (ticks droits) autour de %1.

Ça marche pour moi.

3voto

Michel de Ruiter Points 1004

Cette solution simple fonctionne pour les fichiers sur le C conduire :

@echo off
set X=%1
set X=%X:\=/%
set X=%X:C:=/mnt/c%
bash -lic 'ffmpeg -i "%X%" output.avi'

3voto

Lei Ray Points 21

Voici mon cdwin script, changez le répertoire win en chemin wsl

#!/bin/bash
line=$(sed -e 's~\\~/~g' -e "s/\([CD]\):/\L\1/" -e "s/^/\/mnt\//g" <<< "$1")
cd $line

Utilisez :

#:cdwin 'C:\Users\win\Documents'
#:/mnt/c/Users/win/Documents$

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X