2011-07-27 6 views
4

私は、2日以上経過したタイムスタンプを持つ特定のフォルダ内のファイルをチェックして、削除または削除したり、他の場所にコピーする方法を教えてください。Windowsバッチスクリプトでファイルのタイムスタンプの作成を確認するにはどうすればよいですか?

+0

この質問はserverfaultに属します – onof

+0

あなたは作成タイムスタンプか変更タイムスタンプを意味しますか? –

+0

@onof、IMOこれはバットファイルのプログラミングに関する質問です。 –

答えて

0

削除についてはわかりませんが、RoboCopy(Windows 7の一部)を使用できます。パラメータ:/ MAXAGE:nはnより古いファイルをコピーします - 通常はコピーをバックアップフォルダに行い、後で私は確かにそのディレクトリから「削除」を行います。

これが役に立ちます。

3

~t修飾子を使用してSETコマンドを使用して単純なFORループを実行すると、ディレクトリ内のファイルの最終変更日時が返されます。

@echo off 
setlocal enabledelayedexpansion 
echo Files changed today %date% 
FOR %%A IN (*.*) DO (
    set tf=%%~tA 
    set fd=!tf:~0,10! 
    if !fd!==%date% (
    echo %%F !tf! 
) 
) 

この例を参照してくださいは、詳細な情報については、HELP FORHELP SETを参照してください。

しかし、単純な比較を超えて日付を比較するために上記示した、あなたはBATファイルで日付成分を抽出、各日付コンポーネント

set dd=!tf:~0,2! 
set mm=!tf:~3,2! 
set yyyy=!tf:~6,4! 

を抽出しかし、待つ必要があるため%DATE%、非常にトリッキーな問題です~t修飾子は、完全に(無限に)カスタマイズ可能な、短い日付形式を使用して日付の書式を設定します。 1人のユーザはFri040811を返すようにシステムを設定し、別のユーザは08/04/2011を選択することができます。これはBATプログラマーのための完全な悪夢です。

一時的に形式を変更する方法が考えられます。この例を参照してください。

@echo off 
echo System Date Time = %date% %time% 
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul 
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul 
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul 
echo Normalized Date Time = %date% %time% 
set dd=%date:~8,2% 
set mm=%date:~5,2% 
set yyyy=%date:~0,4% 
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul 

そして最後に、あなたは、日付と算術演算を行う必要があり、あなたはどちらも明らかにされていませんしない日数にDD MM YYYYの日付を変換する必要があります。この変換を行うためのコードがいくつかあります。

:days 
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac, 
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html), 
:: and converted to batch code by Ron Bakowski. 
SET /A Month1 = (1%MM% %% 100 - 14)/12 
SET /A Year1 = %YYYY% + 4800 
SET /A days = 1461 * (%Year1% + %Month1%)/4 + 367 * ((1%MM% %% 100) - 2 -12 * %Month1%)/12 - (3 * ((%Year1% + %Month1% + 100)/100))/4 + (1%DD% %% 100) - 32075 
SET Month1= 
SET Year1= 
goto :eof 

奇妙なイディオム(1%MM% %% 100)はゼロで始まる数字を8進数としてSET /Aが解釈する方法に問題を解決するために使用されます。 CMDでコマンド次...一緒に

@echo off 
setlocal enabledelayedexpansion enableextensions 

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f >nul 
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyyy-MM-dd" /f >nul 
reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH:mm:ss" /f >nul 

set dd=%date:~8,2% 
set mm=%date:~5,2% 
set yyyy=%date:~0,4% 
call :days 
set /a today=!days! 

FOR %%A IN (*.*) DO (
    set tf=%%~tA 
    set fd=!tf:~0,10! 
    set dd=!fd:~8,2! 
    set mm=!fd:~5,2! 
    set yyyy=!fd:~0,4! 
    call :days 
    set /a age= !today!-!days! 
    if !age! leq 2 (
    echo %%A is !age! days old 
) 
) 
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f >nul 
goto :eof 

:days 
:: Algorithm based on Fliegel-Van Flandern algorithm from the Astronomical Almanac, 
:: provided by Doctor Fenton on the Math Forum (http://mathforum.org/library/drmath/view/51907.html), 
:: and converted to batch code by Ron Bakowski. 
SET /A Month1 = (1%MM% %% 100 - 14)/12 
SET /A Year1 = %YYYY% + 4800 
SET /A days = 1461 * (%Year1% + %Month1%)/4 + 367 * ((1%MM% %% 100) - 2 -12 * %Month1%)/12 - (3 * ((%Year1% + %Month1% + 100)/100))/4 + (1%DD% %% 100) - 32075 
SET Month1= 
SET Year1= 
goto :eof 
+1

このようなレジストリ設定を一時的に更新することは大したことだとは言えません。実行中の他のアプリに問題が発生する可能性があります。 – Joe

+2

レジストリ操作を避け、 'wmic'を使います。コマンドラインから次のコマンドを実行してください: 'for/F" tokens = * "%w in( 'wmic os get localdatetime^| find"。 "))は@echo =%Gです。便利な 'yyyymmddhhmmss ...'フォーマットでシステムのローカル日付と時刻を返します。 – JosefZ

関連する問題