Архивирование старых файлов с PowerShell

У меня есть приведенный ниже скрипт Powershell, который пытается архивировать журналы.

  1. Первый шаг - переместить все файлы, которые содержат Spotfire.Dxp.,.* строка каталога ProjectLogsDir.

  2. 2-й шаг - определить Spotfire.Dxp.,.* файлы в каталоге RotatedLogsDir, которые старше 60 дней и помещают их в zip-файл вместе в каталоге ArchivedLogsDir

  3. 3-й шаг - удалить заархивированный файл старше 120 дней.

здесь функция 2-го шага не работает с ошибкой

E:\TIBCO\logsArchival\rotatedDir\C0005749_2014-05-09-12-53-47_Spotfire.Dxp.Web.231.log E:\TIBCO\logsArchival\rotatedDir\C0005749_2014-05-09-12-53-47_Spotfire.Dxp.Web.232.log: ПРЕДУПРЕЖДЕНИЕ: неверный синтаксис имени файла, имени каталога или метки тома.

   $sysname=$env:COMPUTERNAME
   $Date = Get-Date
   $Now = Get-Date -format yyyy-MM-dd-HH-mm-ss
   $host_date=$sysname +"_"+ $Now

   $RotateDays = "60"
   $ArchiveDays="120"
   $ProjectLogsDir = "E:\TIBCO\*\6.0.0\Logfiles"
   $RotatedLogsDir = "E:\TIBCO\logsArchival\rotatedDir"
   $ArchivedLogsDir= "E:\TIBCO\logsArchival\archiveDir"
   $psLogsDir= "E:\TIBCO\logsArchival\shLogsDir"     
   $LastRotate = $Date.AddDays(-$RotateDays)
   $LastArchive = $Date.AddDays(-$ArchiveDays)
   $RenameLogFiles = Get-Childitem $ProjectLogsDir -include Spotfire.Dxp.*.*.* -exclude    spotfire.Dxp.web.KeepAlive.* -Recurse
   $RenameLogFiles
   $RenameLogFiles | Where-Object {!$_.PSIsContainer} |  Rename-Item -NewName { $host_date +"_"+ $_.Name.Replace(' ','_') };

   $RotatedLogFiles = Get-Childitem $ProjectLogsDir -include *_Spotfire.Dxp.*.*.* -Recurse
   $RotatedLogFiles
   $RotatedLogFiles | move-item -destination "$RotatedLogsDir"

   $ZippedLogFiles = Get-Childitem $RotatedLogsDir -include *_Spotfire.Dxp.*.*.* -Recurse | Where {$_.LastWriteTime -le "$LastRotate"}
   $ZippedLogFiles

   function create-7zip([String] $aDirectory, [String] $aZipfile) {
     [string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe";
     [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory";
     & $pathToZipExe $arguments;
      } 

   create-7zip "$ZippedLogFiles"  "$ArchivedLogsDir\$host_date.zip"

    $ZippedLogFiles | Remove-Item -Force

    $DeleteZippedFiles = Get-Childitem $ArchivedLogsDir\*.zip -Recurse | Where  {$_.LastWriteTime -le "$LastArchive"}
    $DeleteZippedFiles
    $DeleteZippedFiles | Remove-Item -Force

    $DeletePsFiles = Get-Childitem $psLogsDir\*.log -Recurse | Where {$_.LastWriteTime -le "$LastRotate"}
    $DeletePsFiles
    $DeletePsFiles | Remove-Item -Force

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

1 ответ

Проблема в том, что вы неправильно вызываете функцию 7-Zip. Посмотрите, что берет функция:

function create-7zip([String] $aDirectory, [String] $aZipfile) {

Он имеет 2 строки в качестве параметров. Затем посмотрите, что вы называете это:

create-7zip "$ZippedLogFiles"  "$ArchivedLogsDir\$host_date.zip"

"$ZippedLogFiles" был определен как раз перед этим, запустив $ZippedLogFiles = Get-Childitem $RotatedLogsDir с несколькими параметрами для фильтрации результатов. Так что тут есть массив объектов FileInfo... а не строка. В том-то и дело, что вы неправильно вызываете функцию.

Что вы действительно хотите включить, так это "$RotatedLogsDir\*_Spotfire.Dxp*.*" так что попробуйте назвать это с этим вместо "$ZippedLogFiles",

Изменить: Комментарий перемещен в ответ для архивирования только файлов более 60 дней.

Вы можете использовать встроенные вызовы.Net для архивирования вещей и не должны использовать 7-Zip. На мой взгляд, еще проще установить расширения сообщества PowerShell и использовать их командлет Write-Zip следующим образом:

$ZippedLogFiles = Get-Childitem $RotatedLogsDir -include *_Spotfire.Dxp.*.*.* -Recurse | Where {$_.LastWriteTime -le "$LastRotate"}
$ZippedLogFiles
$ZippedLogFiles | Write-Zip "$ArchivedLogsDir\$host_date.zip"
Другие вопросы по тегам