Powershell: Сравните последнее изменение со спецификацией c Дата и замените ее на правильную. - PullRequest
1 голос
/ 14 января 2020

Я все еще довольно новичок в powershell, поэтому, пожалуйста, потерпите меня.

У меня есть 2 почти идентичные директории. Файлы и папки из старого каталога были скопированы в новый каталог. Однако во время этого процесса передачи что-то случилось с последней измененной датой. Файлы и папки в новом каталоге имеют неправильные даты последнего изменения (например, сегодня).

Вместо повторного выполнения процесса передачи, который займет много времени, я хотел бы написать что-то в powershell это сравнит даты последнего изменения двух каталогов и исправит даты в новом каталоге.

Я также хотел бы сначала проверить, был ли файл / папка изменен с момента передачи файла. Там не было бы никаких оснований для изменения даты в этих файлах.

То, что я нашел по просмотру и поиску: Ссылка1 Ссылка2 Ссылка 3 Ссылка 4

Я знаю, что могу получить дату последнего изменения файла с помощью:

(Get-Item $filename).LastWriteTime

, где $ filename - это каталог файла.

Я также обнаружил следующее:

dir $directory | ? {$_.lastwritetime -gt "6/1/19" -AND $_.lastwritetime -lt "12/30/19"}

Я знаю, что могу получить информацию о файлах, которые были изменены между двумя датами. Я могу настроить его так, чтобы «меньше чем (-lt)» можно было использовать для проверки файлов, которые не были изменены после определенной даты.

dir $directory | ? {$_.lastwritetime -lt `12/13/19'}

Это выполняет одну из моих целей. У меня есть средство, чтобы проверить, был ли файл изменен после определенного или нет.

Я видел это для изменения значения lastwritetime

$folder = Get-Item C:\folder1
$folder.LastWriteTime = (Get-Date)

и понял, что это просто

(Get-Item $filename).LastWriteTime = (Get-Date)

, который я мог изменить, чтобы достичь своей цели замены нового файла. время последней записи с правильным временем старого файла:

(Get-Item $filename).LastWriteTime = (Get-Item $filename2).LastWriteTime

Полагаю, то, с чем я борюсь, это своего рода соединение всего этого. Я знаю, как пройти через файлы / папки для copy-item или даже Get-Childitem, добавив параметр "recurse". Но у меня возникают трудности с рекурсивной навигацией по каждому каталогу для изменения дат.

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 14 января 2020

Вы можете сделать следующее, чтобы сравнить свойство LastWriteTime исходных файлов и папок с копиями, учитывая, что файлы в папке копий могли быть обновлены с момента последней передачи.

# set the date to the last transfer date to determine if the file was updated after that
$lastTransferDate = (Get-Date).AddDays(-10)  # just for demo 10 days ago

# set the paths for the rootfolder of the originals and the rootfolder to where everything was copied to
$originalPath = 'D:\OriginalStuff'
$copyPath     = 'E:\TransferredStuff'

# loop through the files and folders of the originals
Get-ChildItem -Path $originalPath -Recurse | ForEach-Object {
    # create the full path where the copied file of folder is to be found
    $copy = Join-Path -Path $copyPath -ChildPath $_.FullName.Substring($originalPath.Length)
    # test if this object can be found
    if (Test-Path -Path $copy) {
        $item = Get-Item -Path $copy
        # test if the item has not been updated since the last transfer date
        if ($item.LastWriteTime -le $lastTransferDate) {
            # set the timestamp the same as the original
            $item.LastWriteTime = $_.LastWriteTime
        }
    }
}
1 голос
/ 14 января 2020

Отличная работа с тем, что вы уже сделали.

Просто поместите то, что у вас есть, в оператор foreach.

Foreach($item in (gci 'C:\Users\usernamehere\Desktop\folder123' -recurse)){

    (Get-Item $item.FullName).LastWriteTime = (Get-Item "C:\Users\usernamehere\Desktop\folderabc\RandomFile.txt").LastWriteTime

}

Мы заключаем команду Get-Childitem в -recurse отметьте в скобках, чтобы команда выполнялась сама по себе и стала коллекцией для прохождения нашей команды foreach. $ item - это текущий элемент в l oop. Мы хотим использовать свойство .FullName, чтобы узнать полный путь к файлу для текущего элемента. С учетом сказанного вы будете использовать $item.FullName вместе для файлов, для которых вы собираетесь установить дату.

...