web-dev-qa-db-ja.com

Windowsコマンドラインでファイルの最終更新日を取得する方法は?

次のコマンドを使用してファイルの日付を取得しています。ただし、別のサーバー(Windows Server 2003)に移動して以来、fileDate変数は空白の値を返してきました。

FOR /f %%a in ('dir myfile.txt^|find /i " myfile.txt"') DO SET fileDate=%%a 

ファイルの日付を取得する他のより信頼できる方法はありますか?

18
Ricky Supit

変化する %から%%バッチファイルで使用する場合、%~ta構文入力call /?

for %a in (MyFile.txt) do set FileDate=%~ta
36
Andy Morris

できます

forfiles /M myfile.txt /C "cmd /c echo @fdate @ftime"
11
user2607028

バッチファイルを使用してファイルプロパティを取得するための便利なリファレンスには、最終変更時刻が含まれます。

FOR %%? IN ("C:\somefile\path\file.txt") DO (
    ECHO File Name Only       : %%~n?
    ECHO File Extension       : %%~x?
    ECHO Name in 8.3 notation : %%~sn?
    ECHO File Attributes      : %%~a?
    ECHO Located on Drive     : %%~d?
    ECHO File Size            : %%~z?
    ECHO Last-Modified Date   : %%~t?
    ECHO Drive and Path       : %%~dp?
    ECHO Drive                : %%~d?
    ECHO Fully Qualified Path : %%~f?
    ECHO FQP in 8.3 notation  : %%~sf?
    ECHO Location in the PATH : %%~dp$PATH:?
)
7
PodTech.io

Vistaで動作します。試してみたいこと:

  1. findをfindコマンドの完全修飾パスに置き換えます。 findは一般的なツール名です。 Windowsの組み込み検索とは非常に異なるUNIXの検索があります。このような:
    FOR /f %%a in ('dir ^|%windir%\system32\find.exe /i "myfile.txt"') DO SET fileDate=%%a

  2. cmd.exeウィンドウでコマンドの出力を調べます。そのためには、%%を%に置き換える必要があります。
    FOR /f %a in ('dir ^|c:\windows\system32\find.exe /i "myfile.txt"') DO SET fileDate=%a
    それはあなたにいくつかのアイデアを与えるかもしれません。

  3. 空白として表示される場合は、コマンドプロンプトで再度、これを試してください。

    dir | c:\windows\system32\find.exe /i "myfile.txt"

これにより、表示する必要があるものが表示されます。

それでもそれが分からない場合は、投稿を編集して、これらのコマンドで表示される内容を含めてください。誰かが助けてくれます。

2
Cheeso

vbscriptを使用してファイルの更新日を取得することもできます

Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile= objArgs(0)
WScript.Echo objFS.GetFile(strFile).DateLastModified

上記をmygetdate.vbsとしてコマンドラインに保存します

c:\test> cscript //nologo mygetdate.vbs myfile
1
ghostdog74

どのような出力(exactly)は、現在のディレクトリでdir myfile.txtが出力しますか?区切り文字を設定するとどうなりますか?

FOR /f "tokens=1,2* delims= " %%a in ('dir myfile.txt^|find /i " myfile.txt"') DO SET fileDate=%%a 

delims=の後のスペースに注意してください)
(生活を楽にするために、コマンドラインから%%a%aに置き換えることでこれを行うことができます)

ロケールに依存しない方法でファイルの最終変更日時を取得するには、 wmicコマンドを使用できますDataFileエイリアスを使用:

wmic DataFile where "Name='D:\\Path\\To\\myfile.txt'" get LastModified /VALUE

ファイルへの完全なパスを指定する必要があり、すべてのパス区切り文字(バックスラッシュ\)をここで二重にする必要があることに注意してください。

これは、このような標準化された日付/時刻値を返します(つまり、12番目 2019年8月、13:00:00、UTC + 120 '):

LastModified=20190812130000.000000+120

日付/時刻値をキャプチャするには、 for /F を使用します。その後、 set を使用して変数に割り当てることができます。

for /F "delims=" %%I in ('
    wmic DataFile where "Name='D:\\Path\\To\\myfile.txt'" get LastModified /VALUE
') do for /F "tokens=1* delims==" %%J in ("%%I") do set "DateTime=%%K"

2番目のfor /Fループは、最初のfor /FループによるwmicのUnicode出力のASC​​II/ANSIテキストへの変換によるアーティファクト(孤立した復帰文字など)を回避します(参照: この回答 )。

次に、 sub-string expansion を使用して、これから純粋な日付または時刻を抽出できます。

set "DateOnly=%DateTime:~0,8%"
set "TimeOnly=%DateTime:~8,6%"

作成日時または最終アクセス日時を取得するには、プロパティLastModifiedをそれぞれCreationDateまたはLastAccessedに置き換えます。ファイルではなくディレクトリに関する情報を取得するには、FSDirの代わりにエイリアスDataFileを使用します。

通常wmicで受け入れられない,)の両方を含むファイル(またはディレクトリ)パス/名前を指定するには、 この質問 を見てください。 。

また、 this post および this one をチェックして、ファイルおよびディレクトリの日付/時刻スタンプを取得する方法を確認してください。

0
aschipfl