2012-12-05 26 views
1

好的,我正在做的簡要說明:我使用Windows Media Center(Windows 7)每天晚上記錄Jeopardy。然後我使用Handbrake將.wtv文件轉換爲.mkv文件,然後將它們傳輸到我的NAS,以便稍後使用Plex Media Server/Center觀看它們。而不是「手工」這樣做,我試圖使用批處理文件作爲計劃任務來自動化進程。最初,我已經設置了一個腳本,以便我可以右鍵單擊>發送到> convert.bat,它將啓動Handbrake的命令行界面並轉換文件,將輸出移動到我的NAS,並刪除原始文件(工作很好)。嘗試使用批處理文件處理具有禁止字符的文件名

現在,我在做的是啓動批處理腳本作爲計劃任務,並循環播放「錄製的電視」目錄的內容,並循環播放任何.wtv文件以轉換/移動/刪除它們。

問題出在Windows Media Center使用「!」正確命名Jeopardy文件的事實, (例如:Jeopardy!_KHQ_2012_12_04_21_12_12.wtv),這完全掩蓋了我的劇本。 「Send To」批處理文件效果很好,但是當我遍歷目錄中的* .wtv文件時,它將返回所有文件名與「!」剝離出來,這意味着我不能跟他們蹲下。沒有「!」的文件做順利進行。

在此先感謝任何能讓我指出正確方向的人! (如果你碰巧看到這個劇本可以改善任何其他地區,那也沒關係......)

這裏是我在嘗試使用的基本代碼:

@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 
+1

有逃脫「!」的方式焦炭。它的東西就像^ !!或^^!要麼 !!或類似的東西。玩...你會發現它。 – djangofan

+0

我知道如何逃避一個角色。問題是,在我能對它做任何事情之前,需要逃脫的角色被剝離出來。一些模糊的建議隨後「玩弄,你會發現」並不完全有幫助。不管怎麼說,多謝拉。 – ci5ic

+0

我並不是故意要冒犯你,但你也可以用更容易重現的方式提出你的問題。如果是這種情況,我會更具體。 – djangofan

回答

0

當你有承認,驚歎號被剝離,然後才能逃脫。
這是因爲您在擴展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 
) 
+0

謝謝!我做了一個非常笨重的工作,只是爲了讓它運行,但這是一個更清潔的解決方案,將試一試! – ci5ic

+0

使用「set orgFile = !! F」可以做同樣的事情嗎(不禁用延遲擴展)。這將很容易嘗試。如果它有效:真棒,否則:在這個答案中使用該方法。 – djangofan