Wie kann ich ein bestimmtes Zeichen in einer Variablen in einer Batch-Datei maskieren?

4

Ich habe dieses Skript erstellt, aber es funktioniert nicht:

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

 PAUSE

Nachdem ich nach dem Problem gesucht habe, habe ich festgestellt, dass das Problem der Name der Datei ist, die eckigen Klammern müssen ausgeblendet werden (zum Beispiel [1080p]coolvid.mp4sollten \[1080p\]coolvid.mp4. Wie kann ich das mit dem Namen der Datei machen (dh %% f)?

mdrlol
quelle
Google String-Manipulation
Jiggunjer

Antworten:

4

Die eckigen Klammern müssen entfernt werden

Verwenden Sie die folgende Batchdatei:

@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

Weitere Lektüre


BEARBEITEN: Der ursprüngliche Code schlägt fehl, wenn Sie eine Datei (oder einen Dateipfad) mit dem !Zeichen ausführen, da die verzögerte Erweiterung aktiviert ist und die Variable FOR vor der verzögerten Erweiterung erweitert wird. Namen mit !werden also verfälscht.

Dies lässt sich leicht beheben, indem die verzögerte Erweiterung in der Schleife ein- und ausgeschaltet wird, sodass keine FOR-Variablen erweitert werden, während die verzögerte Erweiterung aktiviert ist.

@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
quelle
1
+1, Alles in Ordnung, außer Sie haben die Beschränkung der %%~nfBeschädigung von Dateinamen, die !do enthalten , auf verzögerte Erweiterung nicht erwähnt. Dies könnte behoben werden, indem die verzögerte Expansion innerhalb der Schleife ein- und ausgeschaltet wird.
Dbenham
@dbenham Hmm. Ich bin nicht sicher, ob ich folge. Können Sie die Antwort bearbeiten und korrigieren, damit ich lerne, wie es richtig gemacht wird? ;)
DavidPostill
Danke, funktioniert super. Ich hatte ein kleines Problem, es stellt sich heraus, dass das -i-Argument von ffmpeg nicht maskiert werden muss (andernfalls heißt es, dass die Datei nicht gefunden wurde), also habe ich "%% f" anstelle von _fullname gesetzt. Das Argument subtitles = muss jedoch mit [] versehen sein.
mdrlol
@mdrlol OK. Ich benutze es nicht, ffmpegalso konnte ich es nicht testen. Ich war mir nicht sicher, ob du die ganze Zeit entkommen musstest, []also habe ich den Code für beide hinzugefügt;) Ich bin froh, dass du es geschafft hast!
DavidPostill
@DavidPostill - Ihr Code ist nicht falsch, er hat nur eine unnötige Einschränkung. Bearbeitung wie gewünscht.
Dbenham