Syntax 循环的批处理语法(如果存在)

Syntax 循环的批处理语法(如果存在),syntax,if-statement,batch-file,for-loop,Syntax,If Statement,Batch File,For Loop,正在尝试创建批处理以将.WTV文件转换为mpg文件。下面的代码我希望每晚运行一次,以转换每日录制的内容,以便在媒体服务器上使用。我关心的语法部分是for循环行。我只想在尚未转换和移动的文件上运行脚本。我不能删除原件,以防出错。最后一个移动循环是获取第一次尝试时无法移动的所有文件 输入文件如下所示:show.wtv 文件中的输出是show.wtv.mpg(我同意) 我不知道如何编写for循环以获得所需的功能。感谢您的帮助 最初的想法来自 更新:最后使用了这个 @echo off set "rec

正在尝试创建批处理以将.WTV文件转换为mpg文件。下面的代码我希望每晚运行一次,以转换每日录制的内容,以便在媒体服务器上使用。我关心的语法部分是for循环行。我只想在尚未转换和移动的文件上运行脚本。我不能删除原件,以防出错。最后一个移动循环是获取第一次尝试时无法移动的所有文件

输入文件如下所示:show.wtv

文件中的输出是show.wtv.mpg(我同意)

我不知道如何编写for循环以获得所需的功能。感谢您的帮助

最初的想法来自

更新:最后使用了这个

@echo off

set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
set ffmpeg="D:\TV Converter\FFMPEG\ffmpeg.exe"
set wtvconv="C:\Windows\ehome\WTVConverter.exe"

for %%f in ("%recordedtv%*.wtv") do If Not Exist "%destfolder%%%~nxf.mpg" (
%wtvconv% "%%f" "%%f.dvr-ms"
%ffmpeg% -y -i "%%f.dvr-ms" -vcodec copy -acodec copy -f dvd "%%f.mpg"
del "%%f.dvr-ms"
move "%%f.mpg" "%destfolder%"
)

for %%f in ("%recordedtv%*.mpg") Do move "%%f" "%destfolder%"

如果计划将其他零件添加到存储在变量中的路径中,请不要使用周围的引号存储路径。只需去掉双引号,或将其如下所示:

...
set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
...
for %%f in ("%recordedtv%*.wtv") do ...
...
for %%f in ("%recordedtv%*.mpg") do ...
"D:\Videos\Recorded TV\D:\Recorded TV\somename.wtv.mpg"
这样,您就可以使用名称/掩码连接路径,而不会导致语法错误。请注意,您的路径没有用双引号分隔,因此您需要根据需要在计算路径的位置对路径进行分隔,因此,例如,循环的
如下所示:

...
set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
...
for %%f in ("%recordedtv%*.wtv") do ...
...
for %%f in ("%recordedtv%*.mpg") do ...
"D:\Videos\Recorded TV\D:\Recorded TV\somename.wtv.mpg"
也要注意其他地方。例如,在脚本中的
move
命令中,还必须对目标路径进行分隔:

move "%%f.mpg" "%destfolder%"
对于文件存在性检查,使用
if exist
命令完成:

if exist target_file (
...    // do whatever you need to do in case the file exists
)
错误在于它将目标文件夹和指向
.wtv
文件的完整路径放在一起,并将结果字符串用作单个路径。因此
%destfolder%%%f“
的计算结果如下:

...
set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
...
for %%f in ("%recordedtv%*.wtv") do ...
...
for %%f in ("%recordedtv%*.mpg") do ...
"D:\Videos\Recorded TV\D:\Recorded TV\somename.wtv.mpg"
我不确定是否有额外的引号,但这不是重点。我想你可以看到主要的问题。要解决此问题,您只需要从
D:\Recorded TV\somename.wtv.mpg
中提取文件名和扩展名,这是使用组合的
~nx
说明符(
n
代表“名称”,而
x
代表“扩展名”)完成的:


(请注意,为了在复杂表达式中正确计算文件夹路径,仍应在不使用双引号的情况下存储文件夹路径。)

感谢所有提示,但这无助于解决总体问题。@GRush:总体问题是什么?对于%%f in(%recordedtv%*.wtv),如果不存在“%destfolder%%%f.mpg”,请不要使用“%destfolder%%%f.mpg”(为了让if not exist正常工作,我做了一些修改,但没有成功。@格鲁什:我想我现在已经找到了,请查看我的更新,并告诉我是否还有问题没有解决。文件路径中的额外引号不会导致问题。此路径完全合法,不会生成语法错误:
“D:\Recorded TV\”“myFile.mpg”
。也就是说,如果可能的话,我希望避免使用额外的引号。