Saya ingin memindahkan folder — yang berisi banyak sub-folder dan file — dari satu drive NTFS ke drive lain, tetapi saya memerlukan metadata date dan nilai atribut cap waktu yang disimpan dari sumber asli pada drive tujuan yang baru.
Masalahnya: Saya perhatikan ketika saya menyelesaikan berbagai operasi penyalinan untuk tugas, nilai timestamp untuk "tanggal pembuatan", "tanggal modifikasi terakhir", dll. Tidak disimpan pada folder yang berisi setidaknya satu folder / file. Saya juga memperhatikan bahwa folder kosong yang dipindahkan pada akhirnya akan dan secara otomatis mengubah tanggal pembuatannya agar sesuai dengan yang lainnya serta ketika menempatkan sesuatu di folder kosong pada drive baru.
Usaha Saya: Saya sudah mencoba hampir semua yang saya dapat temukan melalui Google pada subjek ini (Robocopy, Richcopy, Microsoft SyncToy, Total Commander, Free Commander ... dan banyak, banyak lagi ...) - yang semuanya menghasilkan relatif sama hasil. Tidak ada yang menghasilkan pelestarian komprehensif, 100% dari sumber yang dipindahkan. Robocopy dan Richcopy (bersama dengan "Komandan") datang dekat, tapi saya masih mengalami masalah (dalam semua kasus) di mana tanggal pembuatan salah "diawetkan", tanggal modifikasi terakhir tidak dapat dipertahankan sama sekali, dll. Satu-satunya janji yang benar Saya telah melihat lebih dari itu ... adalah Powershell.
Perjalanan PowerShell saya
Saya menemukan tautan ini:
https://stackoverflow.com/questions/34951911/powershell-move-item-folder-time-stamp
... dengan skrip ini:
function Move-FileWithTimestamp {
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)][string]$Path,
[Parameter(Mandatory=$true,Position=1)][string]$Destination
)
$origLastAccessTime = ( Get-Item $Path ).LastAccessTime
$fileName = ( Get-Item $Path ).Name
Move-Item -Path $Path -Destination $Destination
$(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =
$origLastAccessTime
}
Skrip di utas di atas masih tidak melakukan yang berbeda dari program yang saya daftarkan, tetapi setidaknya di sini, saya memiliki platform di mana saya dapat mengubah / menyesuaikan / men-tweak beberapa hal untuk kebutuhan saya yang sebenarnya. Jadi saya melakukan apa yang saya bisa dengan pengetahuan saya yang terbatas di bidang ini (yaitu mengubah ".LastAccessTime" dengan ".CreationTime", bertukar ".LastAccessTime" dengan "LastWriteTime", dll.), Dan akhirnya relatif dekat untuk mempertahankan semua stempel waktu ( Saya percaya pada satu titik, saya telah menyimpan yang terakhir diubah, terakhir diakses, dan terakhir disimpan pada folder pengujian saya). Namun, saya masih tidak dapat mempertahankan tanggal pembuatan dengan benar, dan apa yang dapat saya capai dengan yang lainnya jelas hanya diterapkan pada folder uji tunggal (dan tidak ada yang lain, seperti sub-folder di dalamnya ... tapi ini adalah hanya karena saya tidak
Saya berada di atas kepala saya ketika datang ke hal-hal ini, jadi saya bertanya-tanya apakah ada orang di luar sana yang ingin mengatasi ini.
UPDATE: Di sinilah saya sekarang:
function Move-FileWithTimestamp {
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)][string]$Path,
[Parameter(Mandatory=$true,Position=1)][string]$Destination
)
$origCreationTime = ( Get-Item $Path ).CreationTime
$origLastWriteTime = ( Get-Item $Path ).LastWriteTime
$origLastAccessTime = ( Get-Item $Path ).CreationTime
$fileName = ( Get-Item $Path ).Name
Move-Item -Path $Path -Destination $Destination
$(Get-Item ($Destination+'\'+$fileName)).CreationTime = $origCreationTime
$(Get-Item ($Destination+'\'+$fileName)).LastWriteTime =
$origLastWriteTime
$(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =
$origLastAccessTime
}
Ini tampaknya mempertahankan waktu pembuatan asli untuk folder utama yang sedang dipindahkan (serta waktu modifikasi / penulisan terakhir), tetapi jelas waktu yang diakses terakhir berubah ke waktu pembuatan asli dalam proses (sepertinya seolah-olah ketika sebuah folder adalah dipindahkan ke drive baru, Windows, secara default, mengubah waktu diakses terakhir selama proses itu, dan JUGA mengacu pada waktu diakses terakhir baru untuk membuat waktu pembuatan baru folder di lokasi baru (itu TIDAK merujuk pada waktu pembuatan asli apa pun secara wajar). IE jika Anda mencoba dan mengatur waktu pembuatan baru untuk menyamai waktu pembuatan asli, tidak ada yang akan menghasilkan, karena waktu akses terakhir yang baru secara otomatis akan mengubah waktu pembuatan baru untuk menyamakannya. Jadi, jika Anda memaksa Windows untuk membuat waktu akses terakhir yang baru sama dengan waktu pembuatan asli,maka Anda akhirnya berakhir dengan waktu pembuatan yang benar, tetapi waktu akses terakhir yang salah.
Jadi, sekarang saya terjebak dengan waktu akses terakhir yang salah, tetapi memperbaiki waktu untuk yang lainnya. Juga, saya tidak tahu bagaimana saya akan mendapatkan ini untuk diterapkan ke semua subfolder juga, jadi beri tahu saya jika ada yang tahu cara melakukannya.
MEMPERBARUI:
function Move-FileWithTimestamp {
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)][string]$Path,
[Parameter(Mandatory=$true,Position=1)][string]$Destination
)
$origCreationTime = ( Get-Item $Path ).CreationTime
$origLastWriteTime = ( Get-Item $Path ).LastWriteTime
$origLastAccessTime = ( Get-Item $Path ).CreationTime
$origChildCreationTime = ( Get-ChildItem $Path ).CreationTime
$origChildLastWriteTime = ( Get-ChildItem $Path ).LastWriteTime
$origChildLastAccessTime = ( Get-ChildItem $Path ).CreationTime
$fileName = ( Get-Item $Path ).Name
Move-Item -Path $Path -Destination $Destination
$(Get-Item ($Destination+'\'+$fileName)).CreationTime = $origCreationTime
$(Get-Item ($Destination+'\'+$fileName)).LastWriteTime = $origLastWriteTime
$(Get-Item ($Destination+'\'+$fileName)).LastAccessTime =
$origLastAccessTime
$(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {
$_.CreationTime = $origChildCreationTime }
$(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {
$_.LastWriteTime = $origChildLastWriteTime }
$(Get-ChildItem ($Destination+'\'+$fileName)) | ForEach-Object {
$_.LastAccessTime = $origChildLastAccessTime }
}
Sekarang, saya memiliki folder utama dan satu jika itu sub-folder dengan pembuatan yang benar dan tanggal modifikasi terakhir (tetapi tidak diakses terakhir). Saya tidak tahu bagaimana menyelesaikan ini untuk sisa sub-folder di folder utama, dan juga untuk setiap sub-folder di dalam sub-folder tersebut.
sumber
Robocopy /copyall
tidak bekerja?Jawaban:
Pindahkan susunan direktori dan simpan semua nilai atribut cap waktu
Jadi tujuan Anda adalah untuk memastikan bahwa file dan folder yang dipindahkan dari lokasi sumber ke lokasi tujuan memiliki mereka
LastWriteTime
,LastAccessTime
danCreationTime
nilai atribut dipertahankan dari lokasi sumber mana mereka berasal.Naskah
Sumber Daya Lebih Lanjut
sumber
Dengan NTFS, Anda hanya dapat memindahkan file dan folder pada satu disk. Memindahkan direktori pada disk tunggal adalah operasi pada pointer file dan bukan lokasi data pada disk.
Pindahkan NTFS (disk tunggal)
Anda cukup memanggil fungsi .NET Move dari Powershell.
1. Buat file move.ps1
2. Salin berikut ini dan ubah jalur yang diperlukan.
Jika Anda "pindah" dari satu disk ke disk lain, Anda perlu melakukan salinan NTFS dan kemudian menghapus sumbernya. Perilaku default NTFS adalah memperbarui tanggal folder karena secara teknis, mereka adalah folder yang baru dibuat (pointer NTFS) pada disk baru. Untuk mengesampingkan perilaku ini, Anda harus mengatur tanggal pada salinan baru file dan folder seperti yang diposting oleh orang lain. Inilah cara lain untuk melakukan hal yang sama. Di sini saya memanggil kode C # dari Powershell.
NTFS "move" (multiple disks) - Salin sumber secara rekursif ke tujuan, salin atribut, lalu hapus sumber.
Kode yang dipinjam dari sini:
https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories
dan di sini
https://stackoverflow.com/questions/2143460/how-to-convert-c-sharp-code-to-a-powershell-script
Penafian: Ini telah diuji secara minimal. Gunakan dengan risiko Anda sendiri.
sumber