Como faço para escapar de um determinado caractere em uma variável em um arquivo de lote

4

Eu fiz este script, mas não funciona:

for /R %%f in (*.mkv) do (
 ffmpeg -i "%%f" -vf subtitles="%%~nf.mkv" -acodec copy "%%~nf.mp4"
 )

 PAUSE

Depois de procurar o problema, descobri que o problema é o nome do arquivo, os colchetes precisam ser escapados (por exemplo, [1080p]coolvid.mp4 deve se tornar \[1080p\]coolvid.mp4 . Como posso fazer isso com o nome do arquivo? arquivo (ou seja, %% f)?

    
por mdrlol 15.02.2016 / 00:07

1 resposta

4

Os colchetes devem ser escapados

Use o seguinte arquivo em lotes:

@echo off
setlocal
setlocal enabledelayedexpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _c=%%f
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  )
endlocal
pause

Leitura Adicional

EDITAR: O código original falhará se você executar em um arquivo (ou caminho de arquivo) que contém o caractere ! porque a expansão atrasada está habilitada e a variável FOR é expandida antes da expansão atrasada. Então, os nomes com ! serão corrompidos.

Isso é fácil de corrigir ativando e desativando a expansão atrasada dentro do loop, de forma que nenhuma variável FOR seja expandida enquanto a expansão atrasada é ativada.

@echo off
setlocal disableDelayedExpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _c=%%f
  setlocal enableDelayedExpansion
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  endlocal
)
endlocal
pause
    
por 15.02.2016 / 00:47