Powershell LastWriteTimeが正しくありません


2

次のスクリプトを実行して、ディレクトリ内のファイル名の最初の9文字に基づいてディレクトリを作成し、ファイル名に基づいてこれらのディレクトリにファイルを移動します。

dir | %{ 
    $id = $_.Name.SubString(0,9); 
    if(-not (Test-Path $id)) {mkdir $id}; 
    mv $_ "$id\$_";}

今、私が見つけたのは、スクリプトを実行した後、フォルダーが過去数年のLastWriteTimeでマークされていることです。

ここにPowershellからの出力があります

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        13/04/2006   7:25 PM            XXX095_00
d----        13/04/2006   7:29 PM            XXX285_0_

このLastWriteTimeがどこから来たのか誰にも教えてもらえますか?


PCの時計が正しい日付と時刻に設定されていますか?デフォルトでは、現在の時刻が表示されるはずであり、そうしない理由は考えられません(明示的に上書きされない限り)。
マリオ

get-dateは現在の日付と時刻を提供します。
ネイト

タイムスタンプの無効化、再起動、有効化、再起動を試して、ルートの問題がNTFSであるかどうかを確認しますgroovypost.com/howto/microsoft/…–
オースティンT

さて、私はついに歴史的な時代がどこから来たのかを突き止めました。これらのファイルはすべて、ファイバー接続ストレージアレイ上にあり、時間が経ちませんでした。OSが正しい時間を持っていたとしても、PSはthe.arrayから時間を取っています。これですべて良いです。
ネイト

回答:


3

ファイルを移動しても、書き込みとしてカウントされないようです。これは、実際にはファイルの内容に書き込みを行っていないためだと思います。ただし、LastWriteTimeは自分で更新できます。これを試して:

dir | %{ 
    $id = $_.Name.SubString(0,9); 
    if(-not (Test-Path $id)) {mkdir $id};
    $_.LastWriteTime = Get-Date;           # <---- Added line.
    mv $_ "$id\$_";}

(ところで、ステートメントが別の行にある場合、セミコロンは必要ありません。)


1
そのダンフのおかげで、これで問題は解決するはずですが、OSがこのLastWriteTimeを処理してくれると思いました。これらのフォルダーはすべて、移動前の2014年の最終変更時刻があります。
ネイト

1
「LastWriteTime」の3種類があります@nateありますLocalLastWriteTimeRemoteLastWriteTimeOriginalLastWriteTime。これら3人はWin32_OfflineFilesFileSysInfoクラスに住んでいます。PSが使用しているものについては誰もが推測します(特にPSコアモジュールがコンパイルされ、ドキュメントが不足しているため)。
Colyn1337
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.