排除特定的文件扩展名
好吧,我不熟悉脚本,我试图编辑一个批处理脚本文件,该文件在扩展名为.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")
还有更多的脚本,我没有设置这个,做的人没有很大的帮助,这就是为什么我来到这里。
@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分钟运行一次。
这不是我想要做的。我不想移动文件,我正在监视它们,因为有另一个程序可以移动它们。我监视他们告诉我,如果其他程序正在运行,或者如果我需要重新启动一些服务或文件移动的服务器。但感谢您的答案。 – bejahnel 2013-03-19 00:32:06
代码没有移动任何东西。它生成它找到的文件的列表,并将该列表与前一次运行中生成的列表进行比较。每隔五分钟运行一次程序,比较两个文件列表,如果这两个列表有共同的文件名,那么它会生成一条消息,因为如果每个列表中出现相同的文件名,那么它在5分钟前就在那里,现在仍然存在。 – Magoo 2013-03-19 00:46:34
好的,可以工作,我会牢记在心。截至目前,我只是试图编辑当前的批处理脚本以防止误报。它会生成电子邮件,并说它们是.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
语句中;或者可以使用find
或findstr
过滤由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文件被包括在内。但如果你不想满足我的好奇心,我完全理解。
当您尝试在Windows计算机上运行该示例脚本时会发生什么? – 2013-03-18 23:25:45
那个for循环中的'do'部分在哪里? – Endoro 2013-03-18 23:45:46
感谢您的意见。我没有显示do命令,因为一切正常,它发送一封电子邮件,我只是希望它不发送电子邮件扩展名为.ecl.part的文件不相关。现在它发送一个电子邮件文件夹中的任何文件超过5分钟的文件名.ecl,所以我收到我想要的文件的电子邮件,.ecl随着电子邮件文件我不想要.ecl.part。 – bejahnel 2013-03-19 00:20:35