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'
Voici "%1"
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 comme celui /mnt/c/some\ path/file.avi
que Windows Bash comprendrait réellement?
windows-subsystem-for-linux
réflexe de retard
la source
la source
C:
par/mnt/c
(éventuellement pour d'autres lettres de lecteur), n'est-ce pas?Réponses:
Windows Build 17046 [1] contient un nouvel
wslpath
utilitaire capable de convertir les chemins de / vers WSL / Windows. Cette fonctionnalité manquait dans WSL. [2]Exemple d'utilisation:
Vous pouvez appeler
wslpath
depuis Powershell sous Windows:wslpath
options et paramètres:la source
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
devrait être:$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
ça marche quand on s’évade, mais s’évader inutilement est déroutant. On pourrait supposer qu'il faut s'échapper. En outre, je pense que la description-m
,... with ‘/’ instead of ‘\\’
devrait avoir un '\' (je sais que c'est un copier-coller) Si vous le faiteswslpath -w /mnt/c/Users
, il n'imprime pas deux '\\'wslpath
fait partie de la réponse, mais je pense que cet article ne répond pas de manière fonctionnelle à la question - qui demande, lorsqu'un fichier de commandes a unC:\foo\bar\blah
nom de style Windows ( ) pour un fichier de données, comment exécute-t-il une commande WSL sur ce fichier?cat `wslpath '
puis glisser-déposer une déposer dans la console et terminer la ligne:'`
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:
Sortie (avec les guillemets):
Le code est comme suit:
la source
Pourquoi si compliqué?
Changer l'entrée du registre
de
à
Utilisez des guillemets avant wslpath et à la fin, et utilisez des guillemets simples (ticks droits) autour de% 1.
Travaille pour moi.
la source
bash
est appelé à partir d'un fichier de commandes? (Notez que, dans l'exemple, le premier argument de bash est-lic
, il n'est donc pas clair pour moi comment çawslpath '%1'
va fonctionner.) Et pourquoi avez-vous changé de guillemets doubles ("%1"
) à guillemets simples ('%1'
)?