使用 powershell 压缩旧文件

Posted

技术标签:

【中文标题】使用 powershell 压缩旧文件【英文标题】:Zipping older files with powershell 【发布时间】:2014-05-09 13:14:12 【问题描述】:

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

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

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

    第三步是删除超过 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 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"

【讨论】:

我需要压缩那些超过 60 天的文件,这就是我将它们列在变量中的原因。如何压缩 $ZippedLogFiles 变量中的文件 我已经安装了 PSCX 1.2,因为我的 powershell 版本是 1.0,但是 powershell 仍然无法识别 write-zip 您是否将行 import-module PSCX 添加到脚本的开头另外,为什么不至少升级到 PowerShell v2(如果不是 v3 或 v4)?

以上是关于使用 powershell 压缩旧文件的主要内容,如果未能解决你的问题,请参考以下文章

powershell 这将使用power shell获取特定SharePoint网站集下的所有子网站的列表。第二个文件获取我们的子站点

powershell 更新power shell中的帮助系统。第二个文件在Windows中显示帮助文件。第三个文件显示来自在线来源的帮助。

无法使用 Powershell 2.0 压缩文件

使用 7zip 压缩 powershell 5.0

使用 powershell 2 压缩多个文件夹和文件

win10下,cmd,power shell设置默认编码为‘UTF-8