-1

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

还有更多的脚本,我没有设置它,而且设置的人不是很有帮助,这就是我来这里的原因。

4

2 回答 2

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

此脚本在 %savearea% 中保存 %emldir% 中 *.eml 文件的排序基本文件列表,然后将新列表与以前的版本进行比较。如果两者中出现相同的文件名,它将生成消息%%i is MORE than 5 minutes old

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

于 2013-03-19T00:11:02.737 回答
0

尽管在我的测试中我发现情况并非如此,但这听起来像是forfiles在针对您计算机上的 8.3 短文件名评估通配符。你知道如果你在一个同时包含 .doc 和 .docx 文件的目录中并且你做了dir *.doc.docx 文件也会被列出来吗?一样的东西。

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

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 /vgrep -v在 Linux 中一样工作。


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

于 2013-03-19T12:14:43.027 回答