Удаление файла в windows пакетном скрипте не работает - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь создать пакетный скрипт для обрезки 25 секунд с начала всех файлов mp4 в папке. Пакетный скрипт находится в той же папке, что и файлы, и в этой папке есть папка с именем trimmed. Пока это мой сценарий:

@echo off
setlocal DisableDelayedExpansion

:promptdel
set /p delorig=Delete original file (default no)? [Y/N]: 

if not defined delorig (
  set delorig=N
)

set "vartwo="&for /f "delims=YNyn" %%i in ("%delorig%") do set vartwo=%%i

if defined vartwo (
  echo Please state Y or N!
  goto :promptdel
)

for %%a in ("*.mp4") do (
  echo Starting %%a

  rem "Need to rename since file names may contain whitespaces"
  ren "%%a" "working.mp4"
  ffmpeg -loglevel panic -hide_banner -i "working.mp4" -ss 00:00:25.000 -c:v copy -c:a copy "trimmed\%%a"
  ren "working.mp4" "%%a"

  echo %delorig%
  if %delorig% == "Y" (del "%%a" /f /q)
  if %delorig% == "y" (del "%%a" /f /q)

  echo %%a finished!
)

pause

Моя проблема в том, что исходный файл не удаляется независимо от того, введу я y / Y или n / N. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вы процитировали одну сторону уравнения ... но не другую. Измените

  if %delorig% == "Y" (del "%%a" /f /q)
  if %delorig% == "y" (del "%%a" /f /q)

на

  if "%delorig%"=="Y" (del "%%a" /f /q)
  if "%delorig%"=="y" (del "%%a" /f /q)

или еще лучше ... сделайте это, чтобы сделать сравнение без учета регистра.

if /i "%delorig%"=="Y" del "%%a" /f /q
0 голосов
/ 13 февраля 2020

Я решил включить этот ответ, так как считаю, что исправление не является технически лучшим способом решения вашей проблемы.

Лучший способ - использовать choice Команда, вместо разрешения неконтролируемых входных данных через set /p.

Насколько мне известно, нет необходимости изменять имя, содержащее пробелы, тем более что ваш код ffmpeg уже использует имена в двойных кавычках.

Пример:

@Echo Off
"%__AppDir__%choice.exe" /T 10 /D N /M "Delete original file [default No]" 
Set "delorig=%ErrorLevel%" 
For %%G In ("*.mp4") Do (Echo Starting %%G
    "ffmpeg.exe" -loglevel panic -hide_banner -i "%%G" -ss 00:00:25.000 -c:v copy -c:a copy "trimmed\%%G"
    If Not ErrorLevel 1 If %delorig% Equ 1 Del /F/Q "%%G"
    Echo %%G finished!)
Pause

Обратите внимание, что я включил расширение для ffmpeg, чтобы предотвратить случайное изменение %PATHEXT% от неиспользуемых файлов .EXE. Я бы также предложил, если известно / возможно, использовать полный путь к ffmpeg.exe, чтобы гарантировать, что возможные изменения %PATH% / directory / registry не помешают его запуску (поскольку код явно не задан текущий каталог). Кроме того, код сначала не гарантирует, что в текущем каталоге существует каталог с именем trimmed, поэтому, если ffmpeg не может создать его сам, вам, вероятно, следует выполнить проверку и / или сначала создать его.

...