Comment puis-je échapper à un certain caractère dans une variable dans un fichier de commandes

4

J'ai fait ce script mais ça ne marche pas:

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

 PAUSE

Après avoir recherché le problème, j'ai constaté que le problème est le nom du fichier. Les crochets doivent être masqués (par exemple, [1080p]coolvid.mp4devrait devenir \[1080p\]coolvid.mp4. Comment puis-je faire cela avec le nom du fichier (%% f)?

mdrlol
la source
google string manipulation
jiggunjer

Réponses:

4

Les crochets doivent être échappés

Utilisez le fichier de commandes suivant:

@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

Lectures complémentaires


EDIT: le code original échouera si vous exécutez un fichier (ou un chemin de fichier) contenant le !caractère, car l’expansion différée est activée et que la variable FOR est développée avant l’expansion retardée. Donc, les noms avec !seront corrompus.

Il est facile de remédier à ce problème en activant ou désactivant le développement retardé dans la boucle, de sorte qu'aucune variable FOR ne soit développée tant que le développement retardé est activé.

@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
DavidPostill
la source
1
+1, Tout va bien, sauf que vous avez omis de mentionner la limitation de la %%~nfcorruption des noms de fichiers contenant !do à l'expansion retardée. Cela pourrait être corrigé en activant et désactivant l'extension différée dans la boucle.
Dbenham
@ Dbenham Hmm. Je ne suis pas sûr de suivre. Pouvez-vous éditer et corriger la réponse afin que je puisse apprendre à le faire correctement? ;)
DavidPostill
Merci, fonctionne très bien. J'ai eu un petit problème, il s'avère que l'argument -i de ffmpeg doit être non échappé (sinon, il est dit fichier non trouvé), donc j'ai mis "%% f" au lieu de _fullname. Le sous-titre = argument doit cependant avoir le [] échappé.
mdrlol
@mdrlol OK. Je ne l'utilise pas ffmpegalors je ne pouvais pas le tester. Je n'étais pas sûre de savoir si vous aviez besoin de vous échapper, []alors j'ai ajouté le code pour les deux;) Je suis heureux que ça fonctionne!
DavidPostill
@ DavidPostill - Votre code n'est pas incorrect, il a juste une limitation inutile. Edition faite à la demande.
Dbenham