使用PowerShell压缩旧文件

时间:2014-05-09 13:14:13

标签: file powershell zip

我有以下Powershell脚本,它试图存档日志。

  1. 第一步是将包含Spotfire.Dxp。。* string的所有文件移动到ProjectLogsDir目录。

  2. 第二步是识别RotatedLogsDir目录中超过60天的Spotfire.Dxp。。*文件,并将它们一起放在ArchivedLogsDir目录中的zip文件中

  3. 第三步是删除超过120天的压缩文件。

  4. 此处第二步功能未使用错误

      

    E:\ TIBCO \ logsArchival \ rotatingDir \ C0005749_2014-05-09-12-53-47_Spotfire.Dxp.Web.231.log E:\ TIBCO \ logsArchival \ rotatingDir \ 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 个答案:

答案 0 :(得分:0)

问题是您正在调用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 Community Extensions并使用他们的Write-Zip cmdlet:

$ZippedLogFiles = Get-Childitem $RotatedLogsDir -include *_Spotfire.Dxp.*.*.* -Recurse | Where {$_.LastWriteTime -le "$LastRotate"}
$ZippedLogFiles
$ZippedLogFiles | Write-Zip "$ArchivedLogsDir\$host_date.zip"