web-dev-qa-db-ja.com

コマンドラインを使用して、特定の日付以降に変更されたWindows上のファイルを検索する

コマンドラインを使用して、特定の日付以降に変更されたディスク上のファイルを検索する必要があります。

例えば:

   dir /S /B WHERE modified date > 12/07/2013
13
Daniel Peñalba

PowerShellを使用してこれを行うことができます。試してください:

Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -ge "12/27/2016" }
24
Ralf de Kleine

forfilesコマンドはWindows 7で動作しました。記事は次のとおりです。

変更時刻に基づいてファイルを検索

Microsoft Technetドキュメント:Forfiles上記の例の場合:

forfiles /P <dir> /S /D +12/07/2013
  • / P検索する開始パス
  • / Sサブディレクトリに再帰します
  • / D検索する日付。「+」は「より大きい」または「以降」を意味します
30
John Jesus

ファイルのサイズが変更された後、PowerShellがありませんでした。私は以下を使用しましたが、手掛かりは他の投稿から来ました:

http://www.scotiasystems.com/blog/it-hints-and-tips/quick-way-to-find-recently-changed-files-in-windowsおよびファイルサイズのみのWindowsコマンド

set Target=E:\userdata
rem Date format is M-D-YYYY
set date=12-13-2013
set Filelist=d:\temp\filelist.txt
set Sizelist=d:\temp\sizelist%date%.csv

echo Target is %Target%
echo Start date is %date%
echo file list is %Filelist%
echo Sizelist is %sizelist%

Xcopy %Target% /D:%date% /L /S  > %Filelist%
echo FileSize (bytes), FileName > %sizelist%

For /f "tokens=1 delims=;" %%j in (%Filelist%) do (
                call :Size "%%j"
                )
Goto :EOF

:Size
@echo off
echo %~z1, %1 >> %sizelist%
3

この例のように、XCOPYを使用して特定の日付以降に変更されたファイルを検索し、2018年の最終日以降のファイルを検索できます。

xcopy *.* c:\temp\*.* /D:12-31-2018 /L /S

この例では、検索を開始するディレクトリにいます。

C:\ temp *。*は構文の必須条件であり、そこには何もコピーされません。

/ D:12-31-2018は、指定した日付を含め、探しているファイルの変更日を指定します。

/ L:ドライブとパスを含むファイル名を表示し、XCOPYがファイルをコピーしないようにします。

/S:サブディレクトリを検索します。

2
David Hernán

私も同じ問題を抱えていたので、XCOPYを使用してリストを作成し、探していた最終更新日、forループを使用してリストを走査し、各ファイルに必要な日付/時刻情報を追加しましたログへ:

xcopy X:\file_*.log X:\temp /D:07-17-2014 /L /Y > X:\files.txt
for /f "tokens=* delims=" %%a in (X:\files.txt ) do (
    @echo %%~ta %%a >> X:\files.log
)

それは次のようなものになりました、それはまさに私が欲しかったものです。

X:\>()
07/17/2014 09:41 AM X:\file_201407170600.log

X:\>()
07/17/2014 09:41 AM X:\file_201407170615.log

X:\>()
07/17/2014 09:23 AM X:\file_201407170630.log
2
thehme

PowerShellを使用する場合、これは時間と日付の範囲でも機能します。

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge "04/15/2018 20:00:00") -and ($
_.LastWriteTime -lt "04/15/2018 21:00:00")}

プログラムによる日付またはロケールに依存しない日付時刻を使用するには:

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge (new-object System.DateTime 2018, 1, 10, 12, 30, 00)) -and ($_.LastWriteTime -lt (new-object System.DateTime 2018, 1, 14, 12, 15, 59))}

日付と時刻が時間の特定の昇順で入力される場合:

年、月、日、時間、分、秒

1
egallardo

私も同じような挑戦をしました。私はforfilesを使用しましたが、>だけではなく> =を与えることに気付きました。入力日付は変数だったので、date + 1 dayを計算するために一連のフープ/ループを通過したくありませんでした(月の最終日または年の最終日のロジックについて考えてみてください)。

特定の日付でforfilesを実行する関数を作成しました。これにより、変更日が>= _date_のすべてのファイルが取得されます。そして、各ファイルについて、変更日が_date_かどうかを確認し、等しくない場合にのみ、出力をファイルに出力します。つまり、出力ファイルには> _date_のファイルのエントリのみが含まれます。

次に、出力ファイルの存在を確認して、現在のディレクトリにあるファイルのいずれかが入力日よりも古いかどうかを判断できます。さらに、どのファイルが新しいか知りたい場合は、出力ファイルの内容を表示できます。

最後に、入力はMM/DD/YYYYの日付形式を使用するファイルから解析されました。つまり、7月1日は2019年1月7日になります。ただし、FORFILESの日付は先行ゼロを使用しないため、先行ゼロを削除して変換する必要があります。

私の最初の試みは/ Aを使用することでした。値を8進数として読み取るわけではありません。最初の試行の間違いを繰り返さないでください。そこで、先行ゼロを削除する小さなヘルパー関数:getNumを作成しました。

:: ########################################################################
:: :findNewerFiles
::
::     Windowsfile interface will only tell you if a file is
::     greater than OR EQUAL to the current date. Had to figure a way
::     to get just greater than.
::
::     Use 'forfiles' to find all files that are >= the specific date, and for
::     each file if the files date is not equal to the specific date then echo
::     the file information into the new-file-log.
::
::     If the new-file-log exists after we're all done, then it means there is
::     at least one file newer than the specified date.
::
:: PARMS:
::
::     %1 - MONTH
::
::     %2 - DAY
::
::     %3 - YEAR
::
:: ERRORLEVEL:
::     0  if no newer files found
::     !0 if a newer file was found
::
:findNewerFiles
SETLOCAL
    CALL :getNum M "%~1"
    CALL :getNum D "%~2"
    CALL :getNum Y "%~3"


    SET "RETVAL=1"

    %bu.callecho% PUSHD %G[3PROOT_UNC]%

    ECHO Last build date was: %M%/%D%/%Y%
    del "%G[NEW_FILE_LOG]%" >nul 2>&1

    FORFILES /p .\ /S /D +%M%/%D%/%Y% ^
             /c "cmd /c if /I @ISDIR == false if not @fdate==%M%/%D%/%Y% echo @fdate @path>>%G[NEW_FILE_LOG]%"

    IF EXIST "%G[NEW_FILE_LOG]%" (
        SET "RETVAL=0"
        TYPE "%G[NEW_FILE_LOG]%"
    )

    %bu.callecho% POPD
(ENDLOCAL
 EXIT /B %RETVAL%)





:: ########################################################################
:: :getNum
::
::     Remove leading 0 from input number and place results in output variable
::
:: PARMS:
::
::     %1 - OUTPUT VARIABLE
::          Name of the output variable to be populated
::
::     %2 - INPUT VARIABLE
::          The number to have leading zeros trimmed from
::
:: ERRORLEVEL:
::     0  always
::
:getNum
SETLOCAL
    SET "D=%~1"
    SET "M=%~2"

    IF "%M:~0,1%" EQU "0" (
        SET "M=%M:~1%"
    )

(ENDLOCAL
 SET "%D%=%M%"
 EXIT /B 0)
0
John Rocha