Есть задача архивировать все записи разговоров сотрудников и сделать это с такой вот структурой:
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. Коменты в скрипте на польском языке, я уже не стал там ничего менять.