Batch file 删除windows批处理脚本中的文件无效

Batch file 删除windows批处理脚本中的文件无效,batch-file,ffmpeg,Batch File,Ffmpeg,我正在尝试创建一个批处理脚本,用于从文件夹中所有mp4文件的开头开始修剪25秒。批处理脚本与文件位于同一文件夹中,在同一文件夹中有一个名为trimmed的文件夹。这是我目前的脚本: @echo off setlocal DisableDelayedExpansion :promptdel set /p delorig=Delete original file (default no)? [Y/N]: if not defined delorig ( set delorig=N ) s

我正在尝试创建一个批处理脚本,用于从文件夹中所有mp4文件的开头开始修剪25秒。批处理脚本与文件位于同一文件夹中,在同一文件夹中有一个名为
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,原始文件都不会被删除。我做错了什么?

你引用了等式的一面。。。但不是另一个。改变

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

或者更好的是。。。这样做可以使比较不区分大小写

if /i "%delorig%"=="Y" del "%%a" /f /q

我决定将此答案包括在内,因为我认为修复在技术上并不是解决您遇到的问题的最佳方法

最好的方法是使用
choice
命令,而不是通过
set/p
允许不受控制的输入数据

据我所知,没有必要更改包含空格的名称,尤其是当您的
ffmpeg
代码已经使用双引号文件名时

例如:

@Echo关闭
“%\uuuu AppDir\uuuu%choice.exe”/T 10/D N/M”删除原始文件[默认编号]”
设置“delorig=%ErrorLevel%”
对于%%G In(“*.mp4”)Do(回声开始%%G
“ffmpeg.exe”-日志级死机-隐藏条幅-i”%%G”-ss 00:00:25.000-c:v副本-c:a副本“修剪\%%G”
如果不是错误,则级别1如果%delorig%Equ 1 Del/F/Q“%%G”
回声%%G已完成!)
暂停

请注意,我已包含
ffmpeg
的扩展名,以防止意外修改
%PATHEXT%
而不运行
.EXE
文件。如果已知/可能,我还建议您使用
ffmpeg.exe
的完整路径,以确保可能的
%path%
/目录/注册表更改不会阻止其运行(因为代码未明确设置当前目录)。此外,代码不会首先确保名为
trimmed
的目录存在于当前目录中,因此如果
ffmpeg
无法自己创建它,您可能应该执行检查,和/或首先创建它。

代码中缺少
=
左右两侧的空格。它们对于100%语法正确的代码非常重要,正如我在上节的回答中所解释的。Windows命令处理器通常会自动检测(取决于比较的字符串)该语法错误,并自动更正行,并在运算符参数周围插入缺少的空格,但是,最好在批处理文件中写入100%正确的代码,而不是依赖于自动更正。如果“hello”=“world”echo作为第一行,
@pause
作为第二行,并执行此批处理文件。输出是通过
cmd.exe
如果“hello”=“world”echo。因此,在执行IF命令行之前,Windows命令处理器在运算符参数
=
周围插入了缺少的空格。顺便说一句:在批处理文件中使用
==
周围的空格使代码在我看来也更容易阅读,特别是在不使用带有批处理文件语法高亮显示的文本编辑器时。
if /i "%delorig%"=="Y" del "%%a" /f /q