排除特定的文件扩展名

时间:2013-03-18 23:03:46

标签: windows batch-file

好吧,我是脚本新手,我正在尝试编辑一个批处理脚本文件,当扩展名为.ecl的文件位于超过5分钟左右的文件夹中时,该文件会发送电子邮件。但是还有其他带有.ecl.part扩展名的文件被标记,它会发送一封电子邮件而不是.ecl文件。我很好奇是否有我可以添加的内容,以便在文件夹中有.ecl文件超过5分钟时发送电子邮件并忽略.ecl.part文件。我为一个使用[!(。extension to exclude)]的人读了一个。扩展名不排除,我只是想知道这是否适用于我的Windows批处理脚本。如果它可以工作,我就像这样添加它或者像我这样添加.extension不排除[!(。extension to exclude)]

以下是相关脚本的一部分:

     for /f "tokens=1-5 delims=:, " %%a in ('forfiles /p z: /d +0 /s /m *.ecl /c "cmd /c if @isdir==FALSE echo @file,@ftime"') do (
     set  fnam=%%a
     set   fhr=%%b
     set  fmin=%%c
     set  fsec=%%d
     set fampm=%%e

     if "!fampm!" == "PM" if "!fhr!" neq "12" (set /a "fhr=!fhr!+12")

有更多的剧本,我没有说明这一点,所做的人不是很有帮助,这就是我来到这里的原因。

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET savearea=c:\destdir
SET emldir=c:\sourcedir
ECHO.>"%savearea%\emlfiles.new"
DIR /b /a-d /on "%emldir%\*.eml" >>"%savearea%\emlfiles.new"
IF NOT EXIST "%savearea%\emlfiles.old" GOTO noold
FOR /f "usebackqdelims=" %%i IN ("%savearea%\emlfiles.new") DO (
FINDSTR /b /e "%%i" "%savearea%\emlfiles.old" >NUL
IF NOT ERRORLEVEL 1 (ECHO %%i is MORE than 5 minutes old)
)
:noold
MOVE /y "%savearea%\emlfiles.new" "%savearea%\emlfiles.old" >nul
GOTO :eof

此脚本在%savelda%中保存%emldir%中* .eml文件的已排序基本文件列表,然后将新列表与先前版本进行比较。如果两者都显示相同的文件名,则会生成消息%%i is MORE than 5 minutes old

所以 - 您需要做的就是将emldir指向.eml文件所在的位置,savearea指向某个安全目录,将ECHOing消息替换为您喜欢的电子邮件发送命令和计划它使用任务调度程序每5分钟运行一次。

答案 1 :(得分:0)

虽然在我的测试中我发现情况并非如此,但听起来forfiles正在评估计算机上8.3短文件名的通配符。您知道如果您在包含.doc和.docx文件的目录中并执行dir *.doc,也会列出.docx文件吗?同样的事情。

所以* .ecl与你的.ecl.part文件匹配,因为在8.3表示法中他们有.ecl扩展名。您可以确保%fnam:~-4%==.ecl,将for循环的大部分内容包含在if语句中;或者您可以使用findfindstr过滤forfiles循环捕获的for输出。像这样:

for /f "tokens=1-5 delims=:, " %%a in (
    'forfiles /p z: /d +0 /s /m *.ecl /c "cmd /c if @isdir==FALSE echo @file,@ftime" ^| find /v /i ".part"'
) do (
    set  fnam=%%a
    set   fhr=%%b
    set  fmin=%%c
    set  fsec=%%d
    set fampm=%%e

    if "!fampm!" == "PM" if "!fhr!" neq "12" (set /a "fhr=!fhr!+12")
    rem etc.

由于find /v打印的行与其搜索匹配,因此应该有效地过滤掉.ecl.part文件。 find /v的工作方式与Linux中的grep -v类似。


你知道,因为我的测试用例似乎与你描述的症状不符,所以我很想知道用if @isdir==FALSE替换if @ext==\"ecl\"是否也会阻止.ecl。部分文件被包含在内。但如果你不想尝试满足我的好奇心,我完全理解。