Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Групповая модификация времени изменения с помощью счётчика 
Author Message
helb



PostPosted: Mon Nov 03, 2014 21:22    Post subject: Reply with quote

Пользуюсь powershell-скриптом близким и частично пересекающимся по назначению.
Скрипт для корректировки времени модификации по возрастанию в соответствии с порядком в списке. Нужен для того, чтобы порядок по времени соответствовал смысловому порядку, и последний оставался корректным при сортировке по времени. Корректирует с шагом в секунду и только там где требуется.

Запускать командой вида “powershell <имя.ps1> <параметры>”. PS должен быть установлен (актуально только для Win XP), и должно быть разрешено выполнение скриптов (единовременная команда “Set-ExecutionPolicy RemoteSigned” в среде PS)

reorder-timestamps.ps1:
Code:

<#   Reorder Timestamps by helb
   Adjusts timestamps of listed items to reflect list order from oldest to newest
   Корректирует время модификации указанных объектов по возрастанию в соответсвии с их порядком
   Usage: “<list file (UTF-8)>”
   Total Commander parameter: %UL
#>
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

function msgBx($text, $title, $btns = 0) {
   return [System.Windows.Forms.MessageBox]::Show($text, $title, $btns)
}

function lowerThanRemaining($idx) {
   $ts = $f[$idx].time
   for ($j = $idx+1; $j -lt $f.length; $j++) {
      if ($f[$j].time -lt $ts) { return $false }
   }
   return $true
}

if ($args.length -lt 1) { msgBx "No parameters." "Error"; return }
$list = [environment]::ExpandEnvironmentVariables($args[0])

if (!(test-path -literalPath $list)) { msgBx "List file not found." "Warning"; return }
$files = get-content $list | where-object { (test-path -literalPath $_) }
if ($files.length -lt 2) { msgBx "Too few files" "Error"; return }
$f = @()
foreach ($entry in $files) {
   $file = get-item -literalPath $entry -force
   $fl = New-Object System.Object
   $fl | Add-Member -type NoteProperty -Name obj -value $file
   $fl | Add-Member -type NoteProperty -Name time -value $file.LastWriteTime
   $f = $f + $fl
}

do {
   $cnt = 0
   $low = $prevstamp = $f[0].time
   for ($i = 1; $i -lt $f.length - 1; $i++) {
      if ($f[$i].time -le $prevstamp) {
         $prevstamp = $prevstamp.AddSeconds(1)
         $f[$i].time = $prevstamp
         $cnt++
      }
      elseif ($f[$i].time -gt $f[$i+1].time) {
         if ($f[$i+1].time.AddSeconds(-1) -gt $prevstamp) {
            $prevstamp = $f[$i+1].time.AddSeconds(-1)
            $f[$i].time = $prevstamp
         }
         else {
            if ($f[$i+1].time.AddSeconds(-1) -le $low) { $prevstamp = $low.AddSeconds(1) }
            else { $prevstamp = $f[$i+1].time.AddSeconds(-1) }
            $f[$i].time = $prevstamp
         }
         $cnt++
      }
      else {$prevstamp = $f[$i].time}
      if ($cnt -eq 0) {
         if (lowerThanRemaining $i) { $low = $prevstamp }
      }
   }
   if ($f[$i].time -le $prevstamp) {
      $prevstamp = $prevstamp.AddSeconds(1)
      $f[$i].time = $prevstamp
      $cnt++
   }
} while ($cnt -gt 0)
foreach ($fl in $f) {
   $fl.obj.LastWriteTime = $fl.time
}
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group