Windows批处理文件和&&引用;

Windows批处理文件和&&引用;,windows,batch-file,Windows,Batch File,我正在使用以下批处理文件在网络媒体文件夹中创建已排序的.m3u播放列表: @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 "tok

我正在使用以下批处理文件在网络媒体文件夹中创建已排序的.m3u播放列表:

@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):

…等等

您会注意到.m3u缺少完整路径(这是故意的),因为我希望脚本灵活。用户可以在任何深度/驱动器号映射驱动器,或以UNC(
domain.com\share\Media\TV\SHOW\u NAME
)的身份访问共享。。。etc和.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上对此进行了测试

始终使用
设置“variable=value”
以避免批处理代码中出现此类问题。在批处理代码中,您需要使用例如
Set“\u t2=!\u t1:%CD%=!”

&
具有特殊含义,双引号字符串除外

在命令提示符窗口中运行
cmd/?
,并至少读取此命令输出的最后一个帮助页,以真正筛选出具有指定文件扩展名的文件

这是您的宏,另外还更新了command
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

+一般来说,建议不错,但并非100%准确。这完全取决于批处理解析器的工作顺序。正常扩展发生在检测到有毒字符之前,因此使用正常扩展时不需要引号。这是有效的:
set var=%var:a&b=%
。但这并不是:
set var=!变量:a&b=。在这两种情况下使用引号可能是一种很好的做法,即使它们只在第二种情况下才需要。@Mofi@dbenhamFANTASTIC@非常感谢你!我现在有一个新发现的问题:脚本不会在任何包含单词“bat”的文件夹中运行。例如:找不到E:\Share\Media\TV\Batman找不到E:\Share\Media\TV\Battstar Galactica有什么想法吗?测试文件夹“Idontwannabeabatmanguy”也不起作用。请参阅上面我编辑的答案中更新的批处理代码。
@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