[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 求助批处理中将带括号的文件名赋值到for语句的变量的问题

本帖最后由 xfs123 于 2012-9-25 15:59 编辑

想用ffmpeg.exe批量将h.264/aac的mkv视频文件转成mp4格式。具体是想将多个文件直接拖到.bat图标上,读取各文件路径,启用ffmpeg,复制视频流和音频流。代码如下:
  1. @echo off
  2. for %%a in (%*) do ffmpeg.exe -i %%a -vcodec copy -acodec copy -y %%~dpna.mp4
  3. pause
复制代码
发现将带括号的文件名拖进来会直接一闪而过,好像批处理会将文件名括号内的内容识别为一个指令。

该用usebackq或者变量延迟什么的吧,自己尝试了许久还是不行,麻烦论坛上的大牛指导下了,谢谢。

还有仅仅
  1. @echo off
  2. for %%a in (%*) do echo %%a
  3. pause
复制代码
就会有问题哎

  1. @echo off
  2. call :a %*
  3. pause
  4. :a
  5. if "%~1" neq "" echo %~1&shift&goto :a
复制代码
会丢弃路径中的%符号

TOP

会丢弃路径中的%符号
apang 发表于 2012-9-25 17:01



修改了下,可行:
  1. @echo off
  2. call :a %*
  3. goto :end
  4. :a
  5. if "%~1" neq "" f:\ffmpeg\bin\ffmpeg.exe -i "%1" -vcodec copy -acodec copy -y "%~dpn1.mp4"&shift&goto :a
  6. :end
复制代码
只是末尾不能添加pause了,否则每循环一次就要暂停下。。。

TOP

有讨论过 %* 中含特殊字符致错的情况:
http://bbs.bathome.net/thread-7509-1-1.html
除了脚本运行前已发生错误的特殊情况,其余都可避免,这里给出一个针对楼主需求而修改的方案:
  1. @echo off
  2. set str=%*
  3. setlocal enabledelayedexpansion
  4. set str= !str:^"=!
  5. for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "str=!str: %%a:=" "%%a:!"
  6. for /f "delims=" %%a in (^"!str:~2!"") do endlocal&echo %%a
  7. pause
复制代码
方案原形和另一个方案见:
http://bbs.bathome.net/redirect. ... 4&fromuid=30406

TOP

返回列表