使用 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中显示帮助文件。第三个文件显示来自在线来源的帮助。