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