首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用批处理文件处理包含禁用字符的文件名

尝试使用批处理文件处理包含禁用字符的文件名
EN

Stack Overflow用户
提问于 2012-12-05 13:48:02
回答 1查看 874关注 0票数 1

好了,简单解释一下我在做什么:我每天晚上都会使用Windows Media Center (Windows 7)来录制Jeopardy。然后,我使用Handbrake将.wtv文件转换为.mkv文件,然后将它们传输到我的NAS,这样我以后就可以使用Plex Media Server/Center观看它们。我不是“手动”完成这项工作,而是尝试使用批处理文件作为计划任务来自动执行该过程。最初,我设置了一个脚本,这样我就可以右键单击> Send To > convert.bat,它将启动Handbrake的命令行界面,转换文件,将输出移动到我的NAS,并删除原始文件(效果很好)。

现在,我要做的是将批处理脚本作为计划任务启动,循环访问我的“录制的电视”目录中的内容,并循环访问任何.wtv文件以转换/移动/删除它们。

问题出在Windows Media Center正确地将Jeopardy文件命名为"!“在他们(例如:危险!_KHQ_2012_12_04_21_12_12.wtv),这完全砖我的脚本。“发送到”批处理文件运行得很好,但是当我遍历目录中的*.wtv文件时,它返回所有带有"!“的文件名。光着身子就意味着我不能和他们一起下蹲。不带"!“的文件处理过程不会出现任何故障。

提前感谢那些能给我指明正确方向的人!(如果您碰巧看到这个脚本可以改进的任何其他方面,那也很好……)

下面是我尝试使用的基本代码:

代码语言:javascript
复制
@echo off

setlocal ENABLEDELAYEDEXPANSION

SET count=0
SET getFolder=C:\Users\Public\Recorded TV\
SET ripFolder=C:\Rips\
SET putFolder=Z:\Videos\Recorded TV\

FOR %%F IN ("%getFolder%*.wtv") DO (
SET /A count=!count!+1

REM DETERMINE OUTPUT FILENAME
for /f "tokens=5,6,7,8,9,10 delims=\_" %%a in ("%%F") do (
    set show=%%a
    set station=%%b
    set year=%%c
    set month=%%d
    set day=%%e
    set hour=%%f

    REM GENERATE OUTPUT NAMING CONVENTION   
    set output=!show! s!year!e!month!!day! !hour!

)

REM PROCESS WITH HANDBRAKE CLI
"C:\Program Files\Handbrake\HandBrakeCLI.exe" -i "%%F" -t 1 -c 1 -o %ripFolder%!OUTPUT!.mkv  -f mkv --deinterlace="fast" --crop 58:60:2:2 --strict-anamorphic  -e x264 -q 20 --vfr  -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0 --gain=0 --audio-copy-mask none --audio-fallback ffac3 -x ref=1:weightp=1:subq=2:rc-lookahead=10:trellis=0:8x8dct=0 --verbose=1

REM MOVE CONVERTED FILE TO NAS
copy "%ripFolder%!OUTPUT!.mkv" "%putFolder%"

REM DELETE ORIGINAL
del "%%F"

REM DELETE LOCAL RIP
del "%ripFolder%!output!.mkv"
)

echo %count% files processed

pause

ENDLOCAL
EN

回答 1

Stack Overflow用户

发布于 2012-12-05 14:51:51

正如您已经认识到的,感叹号在您可以转义它之前就被剥离了。

这是因为您在启用延迟扩展的同时扩展了FOR循环变量%%F,并且感叹号尝试扩展变量。

您需要在这里切换延迟扩展,因为变量内容在使用延迟扩展时是安全的,但要获得该值,您需要禁用模式。

代码语言:javascript
复制
@echo off
setlocal DisableDelayedExpansion
SET count=0

FOR %%F IN ("%getFolder%*.wtv") DO (
  set "orgFile=%%F"
  SET /A count+=1

  REM DETERMINE OUTPUT FILENAME
  for /f "tokens=5,6,7,8,9,10 delims=\_" %%a in ("%%F") do (
    set show=%%a
    set station=%%b
    set year=%%c
    set month=%%d
    set day=%%e
    set hour=%%f

    setlocal EnableDelayedExpansion
    REM GENERATE OUTPUT NAMING CONVENTION   
    set output=!show! s!year!e!month!!day! !hour!
  )
  REM PROCESS WITH HANDBRAKE CLI
  "C:\Program Files\Handbrake\HandBrakeCLI.exe" -i "%%F" -t 1 -c 1 -o %ripFolder%!OUTPUT!.mkv  -f mkv --deinterlace="fast" --crop 58:60:2:2 --strict-anamorphic  -e x264 -q 20 --vfr  -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0 --gain=0 --audio-copy-mask none --audio-fallback ffac3 -x ref=1:weightp=1:subq=2:rc-lookahead=10:trellis=0:8x8dct=0 --verbose=1

  REM MOVE CONVERTED FILE TO NAS
  copy "%ripFolder%!OUTPUT!.mkv" "%putFolder%"

  REM DELETE ORIGINAL
  del "!orgFile!"

  REM DELETE LOCAL RIP
  del "%ripFolder%!output!.mkv"
  endlocal
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13717087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档