2013-03-18 123 views
-1

好吧,我不熟悉腳本,我試圖編輯一個批處理腳本文件,該文件在擴展名爲.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

回答

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%節省* .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

0

儘管在我的測試中我發現情況並非如此,聽起來好像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文件被包括在內。但如果你不想滿足我的好奇心,我完全理解。

相關問題