Batch file 尝试使用批处理文件处理具有禁止字符的文件名
好的,简单解释一下我在做什么:我每天晚上都用Windows Media Center(Windows 7)录制《危险》节目。然后,我使用手刹将.wtv文件转换为.mkv文件,然后将它们传输到我的NAS,以便稍后使用Plex Media Server/Center观看它们。我不是“手工”完成这项工作,而是尝试将批处理文件作为计划任务来自动化这一过程。最初,我设置了一个脚本,这样我可以右键单击>发送到>转换.bat,它将启动手刹的命令行界面并转换文件,将输出移动到我的NAS,并删除原始文件(效果很好) 现在,我要做的是启动批处理脚本作为一个计划任务,循环我的“录制的电视”目录的内容,循环任何.wtv文件以转换/移动/删除它们 问题在于Windows Media Center正确命名了带有“!”的Jeopardy文件(例如:Jeopardy!_KHQ_2012_12_04_21_12_12.wtv),这完全破坏了我的脚本。“发送到”批处理文件工作得很好,但当我循环遍历目录中的*.wtv文件时,它返回所有带“!”的文件名,这意味着我不能使用它们。没有“!”的文件可以顺利处理 提前感谢任何能为我指明正确方向的人!(如果您碰巧看到此脚本可以改进的任何其他方面,也可以……) 以下是我尝试使用的基本代码:Batch file 尝试使用批处理文件处理具有禁止字符的文件名,batch-file,Batch File,好的,简单解释一下我在做什么:我每天晚上都用Windows Media Center(Windows 7)录制《危险》节目。然后,我使用手刹将.wtv文件转换为.mkv文件,然后将它们传输到我的NAS,以便稍后使用Plex Media Server/Center观看它们。我不是“手工”完成这项工作,而是尝试将批处理文件作为计划任务来自动化这一过程。最初,我设置了一个脚本,这样我可以右键单击>发送到>转换.bat,它将启动手刹的命令行界面并转换文件,将输出移动到我的NAS,并删除原始文件(效果很好
@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
正如您所认识到的,感叹号在您可以转义之前已被去除。
这是因为您在启用延迟扩展时扩展FOR循环变量
%%F
,感叹号尝试扩展变量
您需要在此处切换延迟扩展,因为与延迟扩展一起使用时,变量内容是安全的,但要获得值,您需要禁用模式
@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
)
有一种方法可以避开“!”字符。有点像^!!或者^^ ^!或或者类似的。到处玩。。。你会明白的。我知道如何逃离一个角色。问题是需要转义的角色在我做任何事情之前就被剥离了。一些含糊不清的建议加上“玩转,你会发现”并没有什么帮助。无论如何,谢谢。我不是有意冒犯你,但你也可以用一种我们更容易复制的方式提出你的问题。如果是这样的话,我会说得更具体一些。谢谢!我做了一个非常笨重的工作只是为了让它运行,但这是一个更干净的解决方案,将给它一个尝试!您不能使用“set-orgFile=!!F”做同样的事情(不禁用延迟扩展)吗。这很容易尝试。如果有效:太棒了,否则:使用这个答案中的方法。