2014-09-22 85 views
0

我使用下面的批處理文件來創建分類m3u格式我的網絡媒體文件夾中的播放列表:的Windows批處理文件和「&」

@Echo Off 
color 0e 
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING BAT, TXT, M3U, SRT and JPG FILES 
del "playlist.m3u" 
Setlocal EnableDelayedExpansion 
Set _t0=1 
If ["%CD%"]==["%CD:~0,3%"] Set _t0=0 
For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .db .srt .jpg"^| sort') Do (
Set _t1=%%A 
Set _t2=!_t1:%CD%=! 
Echo !_t2:~%_t0%!)>>playlist.m3u 

示例文件夾結構:

E:\Share\Media\TV\SHOW_NAME\Season 1\ 
E:\Share\Media\TV\SHOW_NAME\Season 2\ 

...等

示例腳本輸出(playlist.m3u):

SHOW_NAME\Season 1\S01E01.avi 
SHOW_NAME\Season 1\S01E02.avi 
SHOW_NAME\Season 1\S01E03.avi 
SHOW_NAME\Season 2\S02E01.avi 

...等

您會注意到.m3u缺少完整路徑(這是故意的),因爲我希望腳本具有靈活性。用戶可以以任何深度/驅動器盤符映射驅動器,或以UNC(domain.com\Share\Media\TV\SHOW_NAME)等方式訪問共享,.m3u播放列表仍然可以運行。我最近遇到的麻煩是,如果一個文件夾包含符號(&)符號,則腳本不能按預期運行。我創建了一個樣本文件夾:

E:\Share\Media\NEW&FOLDER\Season 1 

樣品m3u格式的播放列表:

t1:E:\Share\Media\NEW 
t1:E:\Share\Media\NEW 
t1:E:\Share\Media\NEW 
t1:E:\Share\Media\NEW 
t1:E:\Share\Media\NEW 

提示報告如下:

Set _t2=!_t1:E:\Share\Media\NEW & FOLDER=! 
Echo !_t2:~1! 
) 1>>playlist.m3u 
'FOLDER' is not recognized as an internal or external command, 
operable program or batch file. 

我在做什麼錯?我從這個論壇創建這個批處理文件有很多幫助 - 任何見解都將不勝感激。

P.S.已經在Windows 7和Windows Server 2012R2上進行了測試。

回答

1

請始終使用set "variable=value"以避免批處理代碼中出現此類問題。在您的批處理代碼中,您需要使用例如Set "_t2=!_t1:%CD%=!"

&除了在雙引號字符串中有特殊含義。

在命令提示符窗口中運行cmd /?,並至少讀取該命令輸出的最後一個幫助頁,以真正過濾出帶有指定文件擴展名的文件。

這裏是你的宏,另外還更新命令參數findstr。需要/L來將.解釋爲點,而不是用於匹配除換行符之外的任何字符的正則表達式字符。選項/E僅在文件名結尾處獲得文件擴展名的正匹配。

@echo on 
color 0e 
echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING BAT, TXT, M3U, SRT and JPG FILES 
if exist "playlist.m3u" del "playlist.m3u" 
Setlocal EnableDelayedExpansion 
set "_t0=1" 
if "%CD%"=="%CD:~0,3%" set "_t0=0" 
for /F "tokens=*" %%A In ('dir %* /a-d /b /on /s ^| %SystemRoot%\System32\findstr.exe /V /I /E /L ".bat .m3u .txt .db .srt .jpg" ^| %SystemRoot%\System32\sort.exe') do (
    set "_t1=%%A" 
    set "_t2=!_t1:%CD%=!" 
    echo !_t2:~%_t0%!>>playlist.m3u 
) 
endlocal 
+1

+1,一般很好的建議,但不是100%準確。這一切都取決於批解析器的工作順序。正常擴展發生在檢測到有毒字符之前,因此使用正常擴展時不需要引號。這可以工作:'set var =%var:a&b =%'。但是這不會:'set var =!var:a&b =!'。在兩種情況下使用引號可能是一種很好的做法,即使它們僅在第二種情況下才需要。 – dbenham 2014-09-22 09:40:55

+0

@Mofi @dbenhamFANTASTIC! – tjs4ever 2014-09-23 22:18:36

+0

@Mofi非常感謝你! 我現在有一個新發現的問題:腳本不會運行任何包含單詞「蝙蝠」的文件夾。例如: 找不到E:\ Share \ Media \ TV \ Batman 找不到E:\ Share \ Media \ TV \ Battlestar Galactica 有什麼想法?測試文件夾「Idontwannabeabatmanguy」也不起作用。 – tjs4ever 2014-09-23 22:27:17