8

アクセス時間順に並べ替えて、ファイルとその最終アクセス時間を一覧表示する Windows コマンドを作成しようとしています。

利用した

dir [directory] /O:D /T:A /S /B > output.txt

これにより、ディレクトリおよびサブディレクトリ内のファイルが最終アクセス時刻順に出力されます。ただし、最終アクセス時刻も出力する必要があります。これはどのように達成されますか?

4

1 に答える 1

9

バッチファイル内から:

>output.txt (
  for /f "delims=" %%F in ('dir /o:d /t:a /s /b "c:\myPath\*"') @echo %%~tF %%F
)

ただし、次の点に注意する必要があります。

  • ファイルは、ディレクトリ内のアクセス タイムスタンプによってソートされます。すべてのディレクトリをアクセス タイムスタンプでソートするわけではありません。元のコードにも同じ問題があります。ディレクトリ間で並べ替えるには、アクセス タイムスタンプを解析し、S​​ORT で並べ替えたときに時系列に並べ替える文字列に変換する必要があります。「yyyy-mm-dd hh24:mm」のようなもの。秒にアクセスできないため、それでも特に良いとは言えません。WMIC DATAFILE を使用して、最終アクセスのタイムスタンプを 1 秒未満のレベルでファイル名に一覧表示できます。しかし、それを考えると、なぜわざわざ...

  • Windows が保持する最終アクセス タイムスタンプは信頼できません。アプリケーションがファイルを読み取ることができても、最終アクセスのタイムスタンプが更新されない状況は数多くあります。それについて言及している参考資料をどこかで見たことがありますが、どこにあるかは覚えていません。

フォルダー階層全体の最終アクセス タイムスタンプで並べ替えられたファイルのリストを取得したい場合は、次のようにします。「c:\test\」の下にあるすべてのファイルを一覧表示するとします。

wmic datafile where "drive='c:' and path like '\\test\\%'" get name, lastaccessed | sort

タイムスタンプの形式は次のとおりですYYYYMMDDhhmmssddddddZZZZ

  • YYYY = 年
  • MM = 月
  • DD = 日
  • hh = 時間 (24 時間形式)
  • mm = 分
  • ss = 秒
  • dddddd = マイクロ秒
  • ZZZZ = GMT からの分差で表されるタイムゾーン (最初の文字は記号)


編集

WMIC でのワイルドカード検索は、ひどいパフォーマンスを引き起こします。これは、ルート階層内のすべてのフォルダーを反復処理し、特定のフォルダー (ワイルドカードなし) ごとに WMIC を実行するバージョンです。それなりの性能です。

@echo off
setlocal disableDelayedExpansion
set "root=c:\test"
set "output=output.txt"

set "tempFile=%temp%\dir_ts_%random%.txt"
(
  for /d /r "%root%" %%F in (.) do (
    set "folder=%%~pnxF\"
    set "drive=%%~dF"
    setlocal enableDelayedExpansion
    2>nul wmic datafile where "drive='!drive!' and path='!folder:\=\\!'" get name, lastaccessed|findstr /brc:[0-9]
    endlocal
  )
) >"%tempFile%
sort "%tempFile%" >"%output%"
del "%tempFile%"
于 2012-07-30T22:03:38.030 に答える