排除特定的文件扩展名

问题描述:

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

这里是脚本的问题的一部分:

 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") 

还有更多的脚本,我没有设置这个,做的人没有很大的帮助,这就是为什么我来到这里。

+0

当您尝试在Windows计算机上运行该示例脚本时会发生什么? – 2013-03-18 23:25:45

+0

那个for循环中的'do'部分在哪里? – Endoro 2013-03-18 23:45:46

+0

感谢您的意见。我没有显示do命令,因为一切正常,它发送一封电子邮件,我只是希望它不发送电子邮件扩展名为.ecl.part的文件不相关。现在它发送一个电子邮件文件夹中的任何文件超过5分钟的文件名.ecl,所以我收到我想要的文件的电子邮件,.ecl随着电子邮件文件我不想要.ecl.part。 – bejahnel 2013-03-19 00:20:35

@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 

此脚本%savearea%节省* .eml文件的排序基本文件列表中%emldir%,那么新的列表与以前的版本。如果相同的文件名出现在两个,就会生成消息%%i is MORE than 5 minutes old

所以 - 所有你需要做的是点emldir到哪里你.eml文件所在,savearea一些安全目录,替换邮件带有的电子邮件 - 呼应发送你喜欢的命令,并使用任务调度程序安排它每5分钟运行一次。

+0

这不是我想要做的。我不想移动文件,我正在监视它们,因为有另一个程序可以移动它们。我监视他们告诉我,如果其他程序正在运行,或者如果我需要重新启动一些服务或文件移动的服务器。但感谢您的答案。 – bejahnel 2013-03-19 00:32:06

+0

代码没有移动任何东西。它生成它找到的文件的列表,并将该列表与前一次运行中生成的列表进行比较。每隔五分钟运行一次程序,比较两个文件列表,如果这两个列表有共同的文件名,那么它会生成一条消息,因为如果每个列表中出现相同的文件名,那么它在5分钟前就在那里,现在仍然存在。 – Magoo 2013-03-19 00:46:34

+0

好的,可以工作,我会牢记在心。截至目前,我只是试图编辑当前的批处理脚本以防止误报。它会生成电子邮件,并说它们是.ecl,但事实是,这些文件是.ecl.part,我试图用它排除带有.part的文件。谢谢 – bejahnel 2013-03-19 00:56:53

尽管在我的测试中我发现情况并非如此,听起来好像forfiles正在评估计算机上的8.3短文件名的通配符。您知道如果您位于包含.doc和.docx文件的目录中,并且您执行了dir *.doc,那么.docx文件也会列出。同样的事情。

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

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将阻止.ecl.part文件被包括在内。但如果你不想满足我的好奇心,我完全理解。