2010-08-13 127 views
1

我想創建一個批處理文件,該文件在每個匹配通配符的文件上執行命令(對於簡單示例,雖然我的命令是自定義/不同的)例如* .jpg),它自某日期(例如1-1-2010或更高版本)以來已被修改。日期可以在批處理文件中硬編碼或作爲命令行參數傳遞。批處理文件:迭代文件自給定日期後修改

僞代碼:

 
foreach file C:\Images\*.jpg modified-since 1-1-2010 do 
    del file 

我寧願一個純粹的批處理文件,而不是PowerShell中的VBScript等。如果使用純批處理語言是不可能的,我可以用一個小的/免費的第三方命令以幫助生成修改後的文件列表。我需要支持在Windows 2000或更高版本中運行。


我使用的最終溶液:

(稍微從答覆pipitas修改)

@ECHO OFF 
for /f "usebackq tokens=1-7* delims=/: " %%I in (`dir/o-d/tw ^| findstr /I .jpg`) do (
    if "%%K%%I%%J %%N %%L%%M" GEQ "20100801 AM 0000" (
    del /P %%P 
) 
) 

一些注意事項:刪除/ P不要求在每個刪除Y/N確認。我逃脫了%字符,因此它們將在.bat文件中工作。 ^是逃脫管道所必需的。 「usebackq」使得反引號分隔命令來執行(而不是搜索文字字符串或文件),令牌設置變量的數量以將解析的行放入以%I開頭,並且分隔符設置分隔符(包括尾部空格)用於將這些行解析爲這些標記。我將.jpg添加爲findstr搜索字符串,因爲我只想處理.jpg文件。一些可能的問題是您的語言環境可能會打印日期不同,需要不同數量的變量或不同的分隔符,並且您可能會在文件名中包含一些嵌入式「.jpg」的錯誤肯定匹配(需要findtr正則表達式等) 。

如果您不需要支持Windows 2000及更早版本,使用Johannes建議的forfiles會使這更容易。

+0

批處理文件將在Windows下執行,但需要在每臺Windows 2000或更高版本的計算機上運行,​​因此它不能使用最新Windows版本中的任何內容。我可以使用內置於Windows 2000或更高版本的任何內容,但正如我所說的,我不會使用VBScript等,除非直接批處理文件無法執行此操作。 – Anagoge 2010-08-13 21:56:44

+0

Windows 2000的要求很遺憾地排除[Forfiles](http://technet.microsoft.com/en-us/library/cc753551%28WS.10%29.aspx),它將完全按照您的要求進行。 – Joey 2010-08-14 10:10:27

回答

3

首先幾個預賽:

  • dir /od /tw /s ..\path\to\somedir
    列出該目錄中的文件的所有+子目錄,按日期+時間排序的最後修改,
  • dir /o-d /tw /s ..\path\to\somedir
    相同,但順序相反(最早的最後一個)。

接下來,我對現有路徑使用本地示例。走吧:

dir /tc /o-d /s gstmp\*yell*.tif ^| findstr 2010 
Volume in Laufwerk C: hat keine Bezeichnung. 
Volumeseriennummer: D479-1658 

Verzeichnis von C:\downloads\gstmp 

08/06/2010 05:01 PM   19 compression-g4-emptypage-tiffsep1(Yellow).tif 
08/06/2010 05:00 PM   19 compression-lzw-emptypage-tiffsep1(Yellow).tif 
08/06/2010 04:57 PM   19 compression-g3-tiffsep1(Yellow).tif 
08/06/2010 04:57 PM   19 compression-crle-tiffsep1(Yellow).tif 
08/06/2010 04:56 PM   19 compression-pack-share-tiffsep1(Yellow).tif 
08/06/2010 04:53 PM   19 compression-g4-share-tiffsep1(Yellow).tif 
08/06/2010 04:52 PM   19 compression-lzw-share-tiffsep1(Yellow).tif 
08/06/2010 04:51 PM   19 compression-default-share-tiffsep1(Yellow).tif 
08/06/2010 03:59 PM   19 compression-none-share-tiffsep.Yellow.tif 
08/06/2010 03:55 PM   19 share-tiffsep.Yellow.tif 
       10 Datei(en)  190 Bytes  

我們不喜歡在這一刻額外的標題和摘要信息。我們可以通過過濾某些東西來消除這種情況。我會簡單地使用'2010'。

但n現實問題開始:創建日期和時間可能會以不同的格式打印,具體取決於您的「語言環境」。你可以看到你自己,目前看起來如何。

如果我們能夠以與數字順序完全一致的格式顯示日期,它會不會起作用?然後我們可以通過簡單的數字比較來實現一些關於刪除的邏輯。讓我們試試(如果這對我有用,它不一定適合你 - 你可能需要採用你的語言環境)。請注意, '反引號'( 「``」)我用,還有^ - 符號:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif^
    ^| findstr 2010`) do echo. %I %J %K %L %M %N %O %P 

輸出這裏:

08 06 2010 05 01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif 
08 06 2010 05 00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif 
08 06 2010 04 57 PM 19 compression-g3-tiffsep1(Yellow).tif 
08 06 2010 04 57 PM 19 compression-crle-tiffsep1(Yellow).tif 
08 06 2010 04 56 PM 19 compression-pack-share-tiffsep1(Yellow).tif 
08 06 2010 04 53 PM 19 compression-g4-share-tiffsep1(Yellow).tif 
08 06 2010 04 52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif 
08 06 2010 04 51 PM 19 compression-default-share-tiffsep1(Yellow).tif 
08 06 2010 03 59 PM 19 compression-none-share-tiffsep.Yellow.tif 
08 06 2010 03 55 PM 19 share-tiffsep.Yellow.tif 

快到了,但還沒有完全。我們需要將我們的令牌%I %J %K的訂單更改爲%K %I %J,以便我們的日期顯示爲2010 08 06而不是08 06 2010。另外,如果我們寫入沒有空格的權限令牌,那麼可以獲取日期+時間字符串,以便輕鬆地進行比較。另外,我們跳過%O並用箭頭代替它,只是爲了好玩:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif^
    ^| findstr 2010`) do echo. %K%I%J%L%M%N ==^> %P 

現在輸出更改爲:

201008060501PM ==> compression-g4-emptypage-tiffsep1(Yellow).tif 
201008060500PM ==> compression-lzw-emptypage-tiffsep1(Yellow).tif 
201008060457PM ==> compression-g3-tiffsep1(Yellow).tif 
201008060457PM ==> compression-crle-tiffsep1(Yellow).tif 
201008060456PM ==> compression-pack-share-tiffsep1(Yellow).tif 
201008060453PM ==> compression-g4-share-tiffsep1(Yellow).tif 
201008060452PM ==> compression-lzw-share-tiffsep1(Yellow).tif 
201008060451PM ==> compression-default-share-tiffsep1(Yellow).tif 
201008060359PM ==> compression-none-share-tiffsep.Yellow.tif 
201008060355PM ==> share-tiffsep.Yellow.tif 

現在你幾乎準備用於比較第一場。

但考慮到這一點:我得到12小時的週期我的時間,與AMPM。因此,爲了進行數值比較,我們必須將PM和AM分別替換爲數值,這樣我們的04:51 AM04:50 PM的翻譯仍然會以正確的方式在數字上排序。

現在這個怎麼樣:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif^
    ^| findstr 2010`) do (
     if "%K%I%J %N %L%M" GEQ "20100806 PM 0457" (
      echo. [ %K-%I-%J %L:%M %N %P. ] 
     ) 
) 

此列出了應刪除所有文件,也呈現出各自的日期。到真的刪除,我們只需要用del/p/f/s %P替換最後的echo. ... %P.

+0

謝謝!有時候,我認爲批處理文件是微軟向我們報復我們必須做的非常糟糕的事情。我做了一些編輯,並使其工作。不過,在.bat文件中做任何不重要的事情都會讓我重新考慮不使用VBScript。 – Anagoge 2010-08-16 18:47:55

相關問題