在 powershell 版本 3 中压缩单个文件
Zip individual files in powershell version 3
我们有 windows 2012 台服务器,我们有 powershell 版本 3。我正在尝试根据日期条件将日志文件单独压缩到一个文件夹中。
Compress-Archive 在版本 3 中不可用。
我们没有任何 3rd 方 zip 实用程序,如 WinZip、7z..etc
我尝试使用 [System.IO.Compression.ZipFile] class 但它无法灵活地压缩单个文件。
我的要求是,根据日期捕获日志文件并通过循环发送它们以压缩每个文件并删除原始文件。非常感谢您在这方面的帮助。
提前致谢。
这个答案工作正常 - 它使用 COM 而不是纯 .NET 方法:
https://serverfault.com/a/456496/204875
不过,老实说,我强烈建议下载并使用 7zip 的便携版。无需安装,效率更高,速度更快。如果您可以分发脚本,您通常可以使用它分发一个 exe(尽管,是的,某些环境受到高度管制)。
示例:
$srcdir = "C:\tmp\in"
$zipFilepath = "C:\tmp\out"
$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}
foreach($file in $files) {
$zipFilename = $file.name -replace '\.\w+$','.zip'
$zipFile = "$zipFilepath$zipFilename"
#Prepare zip file
if(-not (test-path($zipFile))) {
set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipFile).IsReadOnly = $false
}
else {
# exit loop if zipfile with same name exists
write-warning "$zipfile exists"
Continue
}
# create new COM object
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipFile)
$zipPackage.CopyHere($file.FullName)
#using this method, sometimes files can be 'skipped'
#this 'while' loop checks each file is added before moving to the next
while($zipPackage.Items().Item($file.name) -eq $null){
Start-sleep -milliseconds 250
}
}
write-host "zipfiles created"
结果:
> dir -Recurse
Directory: C:\tmp\in
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 30/12/2021 4:12 pm 5157 txt1.txt
-a---- 30/12/2021 4:12 pm 5157 txt2.txt
-a---- 30/12/2021 4:12 pm 5157 txt3.txt
-a---- 30/12/2021 4:12 pm 5157 txt4.txt
Directory: C:\tmp\out
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 30/12/2021 4:13 pm 1997 txt1.zip
-a---- 30/12/2021 4:14 pm 1997 txt2.zip
-a---- 30/12/2021 4:14 pm 1997 txt3.zip
-a---- 30/12/2021 4:14 pm 1997 txt4.zip
已在 Windows Server 2012 上进行了全面测试,不需要 shell COM 对象。因此它可以 运行 无人值守。我已通过 Windows 任务计划程序将其安排为每天 运行。
我们有 windows 2012 台服务器,我们有 powershell 版本 3。我正在尝试根据日期条件将日志文件单独压缩到一个文件夹中。 Compress-Archive 在版本 3 中不可用。 我们没有任何 3rd 方 zip 实用程序,如 WinZip、7z..etc 我尝试使用 [System.IO.Compression.ZipFile] class 但它无法灵活地压缩单个文件。
我的要求是,根据日期捕获日志文件并通过循环发送它们以压缩每个文件并删除原始文件。非常感谢您在这方面的帮助。
提前致谢。
这个答案工作正常 - 它使用 COM 而不是纯 .NET 方法:
https://serverfault.com/a/456496/204875
不过,老实说,我强烈建议下载并使用 7zip 的便携版。无需安装,效率更高,速度更快。如果您可以分发脚本,您通常可以使用它分发一个 exe(尽管,是的,某些环境受到高度管制)。
示例:
$srcdir = "C:\tmp\in"
$zipFilepath = "C:\tmp\out"
$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}
foreach($file in $files) {
$zipFilename = $file.name -replace '\.\w+$','.zip'
$zipFile = "$zipFilepath$zipFilename"
#Prepare zip file
if(-not (test-path($zipFile))) {
set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipFile).IsReadOnly = $false
}
else {
# exit loop if zipfile with same name exists
write-warning "$zipfile exists"
Continue
}
# create new COM object
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipFile)
$zipPackage.CopyHere($file.FullName)
#using this method, sometimes files can be 'skipped'
#this 'while' loop checks each file is added before moving to the next
while($zipPackage.Items().Item($file.name) -eq $null){
Start-sleep -milliseconds 250
}
}
write-host "zipfiles created"
结果:
> dir -Recurse Directory: C:\tmp\in Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 30/12/2021 4:12 pm 5157 txt1.txt -a---- 30/12/2021 4:12 pm 5157 txt2.txt -a---- 30/12/2021 4:12 pm 5157 txt3.txt -a---- 30/12/2021 4:12 pm 5157 txt4.txt Directory: C:\tmp\out Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 30/12/2021 4:13 pm 1997 txt1.zip -a---- 30/12/2021 4:14 pm 1997 txt2.zip -a---- 30/12/2021 4:14 pm 1997 txt3.zip -a---- 30/12/2021 4:14 pm 1997 txt4.zip