Архивирование старых файлов с PowerShell
У меня есть приведенный ниже скрипт Powershell, который пытается архивировать журналы.
Первый шаг - переместить все файлы, которые содержат Spotfire.Dxp.,.* строка каталога ProjectLogsDir.
2-й шаг - определить Spotfire.Dxp.,.* файлы в каталоге RotatedLogsDir, которые старше 60 дней и помещают их в zip-файл вместе в каталоге ArchivedLogsDir
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"