Я хочу написать скрипт для обновления отметки времени 5 файлов в каталоге за один раз. Например, если в папке 15 файлов, то сначала нужно обновить отметку времени 5 файлов, подождать некоторое время или попросить пользователя ввести любую клавишу, чтобы обновить другой набор из 5 файлов, затем еще один файл ожидания / ввода и 5 файлов. и так далее.

Ниже у меня есть команда для обновления отметки времени всех файлов в папке за один раз, но не могли бы вы сказать мне команду для выполнения моего требования?

$currentTime = Get-Date
$folderItems = Get-ChildItem $dir

foreach ($item in $folderItems)
{
    $item.LastWriteTime = $currentTime
    $currentTime = $currentTime.AddMinutes(0)
}
$folderItems

3 ответа3

0

С небольшими изменениями обертывание цикла в другом цикле for должно помочь, например:

for ($i = 0; $i -lt $folderItems.Count; $i += 5) {
    $items = $folderItems[$i..($i+4)]
    foreach ($item in $items) {
        Write-Verbose "Modifying [$($item.FullName)]"
        # Modify LastWriteTime here
    }
    Write-Host "Modified [$($items.Count)] files. " -NoNewline
    Read-Host -Prompt 'Please press any key to continue...'
}

Это устанавливает $i в ноль, зацикливается, пока $i меньше количества элементов в $folderItems (Count), и увеличивает $i на 5 в каждом цикле.
Затем он получает элементы в $folderItems с индексом от $i до $i+4 и обрабатывает их.
Затем он пишет некоторый текст и использует Read-Host для ожидания ввода пользователя, прежде чем продолжить.

Однако вы должны знать, что ваш исходный цикл не изменяет LastWriteTime файла - вместо этого изменяйте свойство объекта PSObject, который вы сохранили в $folderItems .

Вам, вероятно, следует использовать Set-ItemProperty или прочитать комментарий, сделанный romeo-ninov об эмуляции touch .

Пример:

Set-ItemProperty -Path $itemPath -Name LastWriteTime -Value $currentTime

Вы могли бы даже заменить foreach ($item in $items) {...} просто добавив $items в Set-ItemProperty !

Пример:

$items = $folderItems[$i..($i+4)]
$items | Set-ItemProperty -Name LastWriteTime -Value $currentTime
0

Получить замену сенсорного Set-FileTime здесь

  • итерации переменной $ folderItems по индексу и
  • если индекс + 1 модуль 5 равен нулю, спросите / подождите

$currentTime = Get-Date
$folderItems = Get-ChildItem $dir

For ($i=0;$i -lt $folderItems.count;$i++){
    "{0,5} {1}" -f $i,$folderItems[$i].FullName
    Set-FileTime $folderItems[$i].FullName
    if ( ($i+1)%5 -eq 0 ){
        Read-Host "enter any key to update another set of 5 files"
        #Start-Sleep -Seconds 5
    }
}

Закомментируйте либо Read-Host либо Start-Sleep
Отредактируйте вставленное отображение "{0,5} {1}" -f $ i, $ folderItems [$ i].ФИО

Образец вывода:

    0 Q:\Test\2017-04\15
    1 Q:\Test\2017-04\06
    2 Q:\Test\2017-04\01
    3 Q:\Test\2017-04\20
    4 Q:\Test\2017-04\12
enter any key to update another set of 5 files:
0

Большое спасибо за помощь ... на самом деле я хочу увидеть обновленную временную метку файла, поэтому добавил "$ item | Set-ItemProperty -Name LastWriteTime -Value $ currentTime" команда .. я удовлетворен решением

для ($ i = 0; $ i -lt $ folderItems.граф; $ i += 5) {

$items = $folderItems[$i..($i+4)]
foreach ($item in $items) {
    #Write-Verbose "Modifying [$($item.FullName)]"
    $item | Set-ItemProperty -Name LastWriteTime -Value $currentTime
    # Modify LastWriteTime here
}
Write-Host "Modified [$($items.Count)] files. " -NoNewline
dir
Read-Host -Prompt 'please enter to copy next set of files'

}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .