Eu tenho um script em lote do Windows que usa o Windows Ubuntu Bash. Ele recebe um caminho completo do Windows como argumento e passa esse caminho para um comando no Ubuntu Bash.
@echo off
bash -lic 'ffmpeg -i "%1" output.avi'
Aqui "%1"
está o caminho completo do Windows, como"C:\some path\file.avi"
O comando fornece o erro:
C:some pathfile.avi: Protocol not found
O que posso fazer para que esse caminho do Windows seja convertido em um caminho /mnt/c/some\ path/file.avi
que o Windows Bash realmente entenderia?
windows-subsystem-for-linux
atraso
fonte
fonte
C:
por/mnt/c
(potencialmente para outras letras de unidade também), certo?Respostas:
O Windows Build 17046 [1] contém um novo
wslpath
utilitário que pode converter caminhos de / para WSL / Windows. Isso era conhecido como falta do recurso WSL. [2]Exemplo de uso:
Você pode ligar
wslpath
do Powershell no Windows:wslpath
opções e parâmetros:fonte
$ wslpath -a 'C:\\aaa\\bbb\\ccc\\foo.zip'
deve ser$ wslpath -a 'C:\aaa\bbb\ccc\foo.zip'
. Funciona quando escapado, mas escapar inútil é confuso. Pode-se supor que deve ser escapado. Além disso, acho descrição sobre-m
,... with ‘/’ instead of ‘\\’
deve ter um '\' (eu sei que é cópia colado) Se você fizer issowslpath -w /mnt/c/Users
, ele não imprimir dois '\\'wslpath
seja parte da resposta, mas acredito que esta postagem não responde funcionalmente à pergunta - que pergunta, quando um arquivo em lotes tem umC:\foo\bar\blah
nome no estilo Windows ( ) para um arquivo de dados, como ele executa um comando WSL em esse arquivo?cat `wslpath '
arraste e solte um arquivo no console e termine a linha:'`
Eu escrevi um arquivo bat para fazer isso. Coloque o arquivo onde quer que esteja trabalhando ou adicione-o ao seu caminho (ou apenas coloque-o acima do seu código, o que seria mais fácil de trabalhar). Lembre-se de atribuir "variável" ao caminho do arquivo primeiro (se você estiver usando um arquivo separado, tente usar parâmetros).
O que o código faz:
1) Obtenha a primeira letra do caminho, que é a unidade.
2) Remova as duas primeiras letras.
3) Mude as barras.
4) Esta é a parte complicada: como o Linux faz distinção entre maiúsculas e minúsculas, precisamos converter a letra da unidade maiúscula em minúscula. Faça isso combinando cada um (diga-me se existe uma maneira melhor). Você também pode remover letras de unidade desnecessárias, pois provavelmente não possui mais que dez unidades.
5) Combine tudo para dar a sequência final.
O resultado:
Entrada:
Saída (com aspas):
O código é o seguinte:
fonte
Por que tão complicado?
Alterar a entrada do registro
a partir de
para
Use backticks antes de wslpath e no final e use aspas simples (marcações retas) em torno de% 1.
Funciona para mim.
fonte
bash
é chamado de um arquivo em lotes? (Observe que, no exemplo, o primeiro argumento do bash é-lic
, então não está claro para mim comowslpath '%1'
vai funcionar.) E por que você mudou de aspas duplas ("%1"
) para aspas simples ('%1'
)?