2012-01-11 24 views
1

この質問に既に尋ねられても謝りますが、私が探しているものを正確に見つけることができないようです。私は、特定の日付よりも古いXPでファイルを見つけることができるようにしたい。 30日以上経過したDIR/FINDファイルのようなことをしたい。指定した日付より古いファイルを取得するにはどうすればよいですか?

次のコードは機能しませんが、うまくいけば、私がしようとしていることのアイデアが得られます。

FOR /f %%f IN ('DIR /b /t -30 I:\FOLDER1\*.pdf') DO move /Y Z:\FOLDER1\%%f "I:\FOLDER2\" 

ありがとうございます!

答えて

3

ユリウス日付関数は、過去30日以内に変更されたファイルのリストを取得するDosTips.com function library

まず使用XCOPY/L/Dから取得されます。

XCOPY/Lを使用してすべてのファイルを取得し、FINDSTRを使用してファイルを除外リストから除外し、結果をインクルードリストに保存します。最後にループ

は通じたファイルをリストが含まれており、移動

@echo off 
setlocal 

set src="I:\FOLDER1\*.pdf" 
set dest="I:\FOLDER2" 
set incl="%temp%\includeFiles%random%.txt" 
set excl="%temp%\excludeFiles%random%.txt" 

call :jdate jd 
set /a jd-=30 
call :jdate2date jd yyyy mm dd 
xcopy %src% %dest% /d:%mm%-%dd%-%yyyy% /l | findstr /vxrc:"[0-9]* File(s)" >%excl% 
xcopy %src% %dest% /l | findstr /vxrc:"[0-9]* File(s)" | findstr /vixlg:%excl% >%incl% 
set /a "fail=0, ok=0" 
for /f "usebackq eol=: delims=" %%F in (%incl%) do (
    move /y "%%F" %dest% >nul 2>&1 && (
    echo "%%F" 
    set /a "ok+=1" 
) || (
    >&2 echo ERROR: Unable to move "%%F" 
    set /a "fail+=1" 
) 
) 
echo ---------------------- 
echo Moved %ok% files 
if %fail% gtr 0 echo Failed to move %fail% files 
del %excl% 
del %incl% 
exit /b %fail% 


:jdate2date JD YYYY MM DD -- converts julian days to gregorian date format 
::      -- JD [in] - julian days 
::      -- YYYY [out] - gregorian year, i.e. 2006 
::      -- MM [out] - gregorian month, i.e. 12 for december 
::      -- DD [out] - gregorian day, i.e. 31 
:$reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html 
:$created 20060101 :$changed 20080219 :$categories DateAndTime 
:$source http://www.dostips.com 
SETLOCAL ENABLEDELAYEDEXPANSION 
set /a L= %~1+68569,  N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*(L+1)/1461001 
set /a L= L-1461*I/4+31, J= 80*L/2447, K= L-2447*J/80,  L= J/11 
set /a J= J+2-12*L,  I= 100*(N-49)+I+L 
set /a YYYY= I, MM=100+J, DD=100+K 
set MM=%MM:~-2% 
set DD=%DD:~-2% 
(ENDLOCAL & REM RETURN VALUES 
    IF "%~2" NEQ "" (SET %~2=%YYYY%) ELSE echo.%YYYY% 
    IF "%~3" NEQ "" (SET %~3=%MM%) ELSE echo.%MM% 
    IF "%~4" NEQ "" (SET %~4=%DD%) ELSE echo.%DD% 
) 
EXIT /b 

:jdate JD DateStr -- converts a date string to julian day number with respect to regional date format 
::    -- JD  [out,opt] - julian days 
::    -- DateStr [in,opt] - date string, e.g. "03/31/2006" or "Fri 03/31/2006" or "31.3.2006" 
:$reference http://groups.google.com/group/alt.msdos.batch.nt/browse_frm/thread/a0c34d593e782e94/50ed3430b6446af8#50ed3430b6446af8 
:$created 20060101 :$changed 20090328 :$categories DateAndTime 
:$source http://www.dostips.com 
SETLOCAL 
set DateStr=%~2&if "%~2"=="" set DateStr=%date% 
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
    for /f "tokens=1-3 delims=/.- " %%A in ("%DateStr:* =%") do (
     set %%a=%%A&set %%b=%%B&set %%c=%%C)) 
set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100" 
if %yy% LSS 100 set /a yy+=2000 &rem Adds 2000 to two digit years 
set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4 
ENDLOCAL & IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%) 
EXIT /b 

私はそれが暗黙のワイルドカードを持つものとしてファイルを扱うため、XCOPY /オプションをEXCLUDE使用していませんでした。したがって、* .pdfの代わりに*を指定した場合、TESTという名前の除外ファイルは、TEST1、TEST.TXT、およびTEST.EXEという名前のファイルも除外します。

FINDSTR/Iオプションは、複数のリテラル検索文字列で検索するときにFINDSTRのバグを補正するために必要です。/Iオプションは必須ではありませんが、複数のリテラル検索文字列で大文字と小文字を区別して検索すると、間違った結果が得られます。

+0

編集 - 追加されたロギング情報とFINDSTRバグ – dbenham

+0

を補完しました。私はついにこれを見直すことができました。努力をいただきありがとうございます! – northpole

1

使用forfiles

forfiles /p "i:\folder1" /m *.pdf /d -30 /c "move /y z:\folder1\@file i:\folder2" 
+0

forfilesはXP上では動作しません(少なくとも、それは有効なコマンドではありません)。 – northpole

+0

@northpole:コピーをダウンロードしようとしましたか? http://www.petri.co.il/download_free_reskit_tools.htmから実行していますか? – Jon

+0

いいえ、私は、しかし、rktoolsをつかんで、それをrobocopyを使用して動作させることができます。しかし、私は、すでにインストールされているコマンドを使用してこれを行うことができれば、これを使用する各PCにダウンロードしてインストールする必要はありません。 – northpole

0

がxcopyでこれを行う方法についてbatch file to delete files older than a specified dateへの回答を参照してください。

xcopyを使用すると完全な日付を指定する必要があります(「30日前」とは言えません)が、他のコマンドでこれを計算できます。除外リストに保存します。

関連する問題