Форум системных администраторов

IT => Windows => Тема начата: 2site от 22 октября 2018, 17:08:12

Название: Помогите написать скрипт Powershell
Отправлено: 2site от 22 октября 2018, 17:08:12
Есть задача архивировать все записи разговоров сотрудников и сделать это с такой вот структурой:
Records\2017\
Records\2018\[вн номер телефона]\дата.zip
Records\2018\203\20181016.zip
Records\2018\203\20181017.zip
и так далее.

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

$Year = (Get-Date -Format "yyyy")
$sciezka = "D:\Nagrania"
$TARGETDIR = "\\telerate\Archiwum_rozmów_pracowników$\Nagrania\$Year"
$Date = (Get-Date -format "yyyy-MM-dd")
$logdate = (Get-Date -format "dd-MM-yyyy")
$logpath = $TARGETDIR + "\" + $logdate + "log.txt"
$errorlog =""
## tworzenie folderu w ściezce jeżeli go nie ma
if( -Not (Test-Path -Path $TARGETDIR ) ) {
New-Item -ItemType directory -Path $TARGETDIR
}
## kopiowanie danych sprzed 1 dnia
$aSrc = dir $sciezka | ?{$_.PSISContainer}
foreach ($src in $aSrc) {
$apliki = Get-ChildItem -Path $src.FullName -Filter "*.wav" -Recurse | where-object {$_.lastwritetime -ge (Get-Date -Hour 0 -Minute 00 -Second 00).AddDays(-1) -and $_.lastwritetime -lt (Get-Date -Hour 0 -Minute 00 -Second 00)}
"Archiwum " + $src.Name + "_" + $Date + ".zip"
$apliki | Compress-Archive -DestinationPath ( $TARGETDIR + "\" + $src.Name + "_" + $Date + ".zip" )
}
#jezeli jakis error to zapisz, a jak nie to usuwaj
if ($error[0] -ne $null) {
                $errorlog += $error[0]
                $errorlog += " `n`n"
                  }
               
                else { $errorlog += "Folder glowny " + $sciezka +  " usunie"
                      $aapliki = Get-ChildItem -Path $sciezka $src.FullName -Filter "*.wav" -Recurse | where-object {$_.lastwritetime -ge (Get-Date -Hour 0 -Minute 00 -Second 00).AddDays(-1) -and $_.lastwritetime -lt (Get-Date -Hour 0 -Minute 00 -Second 00)}
                     # $apliki | Remove-Item -path $sciezka
                     $aapliki | Out-File ($TARGETDIR + "\" + $src.Name + "_" + $Date + ".txt")
                      }
         
           

В этом скрипте мне нужно поменять раздел "## kopiowanie danych sprzed 1 dnia". Я так понимаю, что в нем нужно вставить еще один foreach который вместо "where-object {$_.lastwritetime -ge (Get-Date -Hour 0 -Minute 00 -Second 00).AddDays(-1) -and $_.lastwritetime -lt (Get-Date -Hour 0 -Minute 00 -Second 00)} " будет перебирать даты и создавать соответсвующие архивы, только вот не могу докумекать как это сделать.

Для названий архивов удалось мне сообразить что-то такое:

$answer = Get-ChildItem d:\nagrania\* -Recurse -Filter "*.wav" | select Name, @{Name="LastWriteTime";
         Expression={$_.LastWriteTime.ToString("yyyy-MM-dd")}} | Sort LastWriteTime -Descending | Group-Object -Property LastWriteTime  | Format-List name | Out-String
$answer -creplace "Name : "

но я так понимаю для поиска он не подойдет.
Ни имел опыта создавать скрипты где foreach в foreach, не варит уже башка как это все собрать в кучу :)

P.S. Коменты в скрипте на польском языке, я уже не стал там ничего менять.

Название: Помогите написать скрипт Powershell
Отправлено: LostMy от 21 ноября 2018, 18:16:27
Если названия файла содержит номер телефона, то можно сделать так:
$date = get-date -Format dd.MM.yyyy
$filelist = gci D:\* -Include "*.txt"| ? {$_.LastWriteTime -ge (get-date).AddDays(-1)}
foreach ($file in $filelist){
    if((test-path "d:\!fortest\$date") -eq $false){
        New-Item "d:\!fortest\$date" -ItemType directory
    }
    if((test-path "d:\!fortest\$date\$($file.BaseName)") -eq $false){
        New-Item "d:\!fortest\$date\$($file.BaseName)" -ItemType directory
    }
    Copy-Item $file.fullname -Destination "d:\!fortest\$date\$($file.BaseName)"
}