web-dev-qa-db-fra.com

Convertir le chemin Windows pour Windows Ubuntu Bash

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

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

Ici "%1" est le chemin 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 convertir ce chemin Windows en un chemin tel que /mnt/c/some\ path/file.avi que le Bash Windows comprendrait réellement?

25
laggingreflex

Windows Build 17046 [1] contient le nouvel utilitaire wslpath pouvant convertir les chemins de/vers WSL/Windows. . Cette fonctionnalité manquait dans WSL. [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 de Powershell sous 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 ‘\\’
32
illagrenan

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

Que fait le code:

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

2) Enlevez les deux premières lettres.

3) Changer les barres obliques.

4) C’est la partie la plus délicate: comme Linux est sensible à la casse, nous devons convertir la lettre du lecteur en majuscule en minuscule. Faites-le en faisant correspondre chaque (dites-moi s'il y a un meilleur moyen). Vous pouvez également supprimer les lettres de lecteur inutiles, car vous n’avez probablement pas plus de dix lecteurs.

5) Tout combiner pour donner la dernière chaîne.

Le résultat:

Contribution:

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

Sortie (avec les guillemets):

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

Le code est comme suit:

@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
5
PulseJet

Pourquoi si compliqué?

Changer l'entrée du registre

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

de

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

à

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.

Travaille pour moi.

0
Stefan Oskamp