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

时间:2012-01-22 03:17:17

标签: syntax if-statement batch-file for-loop

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

输入文件如下:show.wtv

文件中的输出是show.wtv.mpg(我很好)

我不知道如何编写for循环以获得所需的功能。任何帮助表示赞赏。

最初的想法来自http://ireckon.net/2009/10/converting-wtv-to-mpg-in-windows-7/

@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%%%f.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%

更新:使用此

结束
@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%"

1 个答案:

答案 0 :(得分:1)

如果您计划将其他部分添加到存储在变量中的路径,请不要使用周围的引号存储路径。只需留下双引号或将它们放在这样:

...
set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
...

这样,您就可以使用名称/掩码连接路径,而不会导致语法错误。请注意,您的路径不是用双引号分隔的,因此您需要根据需要在它们被评估的位置分隔它们,因此,例如,for循环将如下所示:

for %%f in ("%recordedtv%*.wtv") do ...
...
for %%f in ("%recordedtv%*.mpg") do ...

也要注意其他地方。例如,在脚本的move命令中,目标路径也必须分隔:

move "%%f.mpg" "%destfolder%"

对于文件存在检查,使用if exist命令完成:

if exist target_file (
...    // do whatever you need to do in case the file exists
)

target_file 位可以是文件,掩码或目录(在后一种情况下,它应以\结尾)。

<强>更新

我想我现在可以看到你脚本的一个特殊问题了。这部分

for %%f in (%recordedtv%*.wtv) Do If Not Exist "%destfolder%%%f.mpg"

错误在于它将您的目标文件夹和完整路径放在一起.wtv文件,并将结果字符串用作单个路径。因此,"%destfolder%%%f"会被评估为:

"D:\Videos\Recorded TV\D:\Recorded TV\somename.wtv.mpg"

我只是不确定额外的引号,但这不是重点。我想你可以看到主要问题。要解决此问题,您需要仅从D:\Recorded TV\somename.wtv.mpg中提取文件名和扩展名,这是使用合并的~nx说明符(n代表'name'和x来完成的'延伸'):

for %%f in ("%recordedtv%*.wtv") Do If Not Exist "%destfolder%%%~nxf.mpg"

(请注意,文件夹路径仍应存储而不包含双引号,以便在复杂表达式中正确评估它们。)