Tengo un script por lotes de Windows que usa Windows Ubuntu Bash. Recibe una ruta completa de Windows como argumento y luego pasa esa ruta a un comando en Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Aquí "%1"
está la ruta completa de Windows, como"C:\some path\file.avi"
El comando da el error:
C:some pathfile.avi: Protocol not found
¿Qué puedo hacer para que esta ruta de Windows se convierta en una ruta como la /mnt/c/some\ path/file.avi
que Windows Bash realmente entendería?
windows-subsystem-for-linux
laggingreflex
fuente
fuente
C:
con/mnt/c
(posiblemente también para otras letras de unidad), ¿verdad?Respuestas:
Windows Build 17046 [1] contiene una nueva
wslpath
utilidad que puede traducir rutas de / a WSL / Windows. Esto se sabía que faltaba la función WSL. [2]Ejemplo de uso:
Puede llamar
wslpath
desde Powershell en Windows:wslpath
opciones y parámetros:fuente
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
debería ser$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
Funciona cuando se escapa, pero el escape inútil es confuso. Se podría suponer que se debe escapar. Además, creo que en la descripción-m
,... with ‘/’ instead of ‘\\’
debe tener una '\' (Sé que es copia-pegar) Si lo hacewslpath -w /mnt/c/Users
, no se imprime dos '\\'wslpath
es parte de la respuesta, pero creo que esta publicación no responde funcionalmente a la pregunta, que pregunta, cuando un archivo por lotes tiene unC:\foo\bar\blah
nombre de estilo Windows ( ) para un archivo de datos, ¿cómo ejecuta un comando WSL en ese archivo?cat `wslpath '
luego arrastre y suelte un presentar en la consola y terminar la línea:'`
Escribí un archivo bat para hacer esto. Simplemente coloque el archivo donde sea que esté trabajando o agréguelo a su ruta (o simplemente colóquelo sobre su código, lo que sería más fácil de trabajar). Recuerde asignar primero "variable" a su ruta de archivo (si está usando un archivo separado, intente usar parámetros).
Lo que hace el código:
1) Obtenga la primera letra de la ruta, que es la unidad.
2) Eliminar las dos primeras letras.
3) Cambiar las barras inclinadas.
4) Esta es la parte difícil: dado que Linux distingue entre mayúsculas y minúsculas, necesitamos convertir la letra de la unidad en mayúscula a minúscula. Haga esto haciendo coincidir cada uno (dígame si hay una mejor manera). También puede eliminar letras de unidad innecesarias, ya que probablemente no tenga más de diez unidades.
5) Combina todo para dar la cuerda final.
El resultado:
Entrada:
Salida (con las comillas):
El código es el siguiente:
fuente
¿Por qué tan complicado?
Cambiar la entrada del registro
desde
a
Use las marcas de retroceso antes de wslpath y al final, y use comillas simples (marcas rectas) alrededor de% 1.
Funciona para mi.
fuente
bash
se llama desde un archivo por lotes? (Tenga en cuenta que, en el ejemplo, el primer argumento de bash es-lic
, así que no mewslpath '%1'
queda claro cómo va a funcionar). ¿Y por qué ha cambiado de comillas dobles ("%1"
) a comillas simples ('%1'
)?