Скрипт PowerShell для архивирования всех старых файлов в каталоге за месяц - PullRequest
0 голосов
/ 06 февраля 2020

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

После внедрения решения я должен увидеть файлы, как показано ниже Пример:

FolderName_2013-Jan.zip
FOlderName_2013-Feb.zip
FOlderName_2013-Mar.zip
FOlderName_2013-Jan.zip
FOlderName_2017-Jan.zip
FOlderName_2017-Dec.zip

Я нашел несколько статей, но им не хватает информации для динамического прохождения каждого месяца Начало месяца и Конец месяца (Например: 2013-01-01 - 2013-01-31 или с 2015-06-01 по 2015-06-30) для фильтрации файлов за все месяцы, начиная с 2013 года.

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Используя команду Get-ChildItem, как предложено Кираном выше, вы можете генерировать объекты FileInfo и DirectoryInfo. Каждый из них имеет временную метку для файла и / или каталога, хранящуюся в различных свойствах, таких как LastWriteTime, LastAccessTime, CreationTime. Каждое из этих свойств содержит данные типа [DateTime]. Если у вас есть элемент [DateTime] для каждого из ваших файлов / папок, вы можете сделать что-то вроде этого:

#Set variable $MY to be 7 years ago
$Now = (Get-Date)
$MY = $Now.AddYears(-7)

#Write custom Get-ChildItem statements to put list of files/folders in $AllItems variable

#Now, loop through with each month/year
Do
    #Filter $AllItems for the proper Month-Year
    $ThisMonthsItems = $AllItems.Where({$_.LastWriteTime.Month -eq $MY.Month -and $_.LastWriteTime.Year -eq $MY.Year})

    #Use $ThisMonthsItems to add items to your .zip file
    #This step left for you to fill with your compression routines

    $MY = $MY.AddMonths(1)
Loop Until ($MY.Month -eq $Now.Month -and $MY.Year -eq $Now.Year)

Вам, вероятно, потребуется настроить l oop, чтобы получить правильное временное окно, но базовая c идея должна быть там для вас.

Удачи

0 голосов
/ 11 февраля 2020
function Compress-Files {
[CmdletBinding()]
[Alias()]
[OutputType([int])]
Param
(
    # Sourcepath
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
    $SourcePath,

    # number of months to compress in past
    [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, Position = 2)]
    $Months

)

#region variables
$FullPath = $SourcePath + '*.*'
<#
    $date = (get-date).ToString("yyyy-MM-dd")
    $yesterday = (get-date).AddDays(-1).ToString("yyyyMMdd")
    $lastmonth = (get-date).AddMonths(-1).ToString("yyyyMMdd")
    $lastyear = (get-date).AddYears(-1).ToString("yyyyMMdd")
#>
#endregion


#region Compress months
#Compress files based on months in the past.
$Months = '-' + $Months
$Month = (get-date).AddMonths($Month).ToString("yyyyMMdd")

#$files = Get-ChildItem $FullPath | ? {$_.CreationTime -ge $Months -and $_.CreationTime -le $lastmonth}
#$files = Get-ChildItem $FullPath | ? {$_.CreationTime.ToString("yyyyMMdd") -ge $Months -and $_.CreationTime.ToString("yyyyMMdd") -le $lastmonth}

$files = Get-ChildItem -Path $FullPath | ? { $_.LastWriteTime.ToString("yyyyMMdd") -le $Month -and $_.Name -notlike "*.zip" -and $_.Mode -notlike "d*" }



foreach ($file in $files) {
    $filename = ($file.LastWriteTime).ToString("yyyy-MM")
    $DestinationPath = $SourcePath + $filename + '.zip'
    $file | Compress-Archive -DestinationPath $DestinationPath -update  
    Remove-Item $file -Force
    #if ($delete){ }


    ###Move Archiving logs to a text file
    "$DestinationPath|$file " | Out-File  "C:\temp\ExtractsArchive\Archivelog.txt" -Append
}
#>

}

#####Finally use the function on each and every sub directory

$ RootFileDirectory = "C: \ temp \ ExtractsArchive \"

$ Directories = Get-ChildItem -Path $ RootFileDirectory -Recurse -Directory | Выберите FullName

ForEach ($ Directory IN $ Directories) {

$SourcePath = $Directory.FullName.ToString() + "\"

#$SourcePath.GetType()

Compress-Files -SourcePath  $SourcePath -Months 2

}

0 голосов
/ 06 февраля 2020

Вы пробовали что-нибудь до сих пор? Выполните следующие действия ...

  • Получите уникальные даты создания, используя Get-ChildItem с Select-Object -Unique
  • Получите все файлы и сохраните их в переменной
  • ForEach date Отфильтруйте файлы, используя Where-Object и перенаправьте их на Compress-Archive

Попробуйте это на вашем лучшем уровне и все еще не можете понять это, затем обратитесь к этой сущности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...