Powershell压缩文件夹和文件,然后删除旧文件

问题描述:

我想用Powershell自动执行: 1.压缩7天以前的日志文件(.xml和.dat扩展名), 2.将这些压缩的压缩文件其他地方和 3.然后从源中删除原始日志文件。Powershell压缩文件夹和文件,然后删除旧文件

我使用以下Powershell脚本,我从各种资源拼凑在一起。

function New-Zip 
    { 
    param([string]$zipfilename) 
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    (dir $zipfilename).IsReadOnly = $false 
    } 

function Add-Zip 
    { 
    param([string]$zipfilename) 

    if(-not (test-path($zipfilename))) 
    { 
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    (dir $zipfilename).IsReadOnly = $false 
    } 

    $shellApplication = new-object -com shell.application 
    $zipPackage = $shellApplication.NameSpace($zipfilename) 

    foreach($file in $input) 
    { 
     $zipPackage.CopyHere($file.FullName) 
     Start-sleep -milliseconds 500 
    } 
    } 

$targetFolder = 'C:\source' 
$destinationFolder = 'D:\destination\' 
$now = Get-Date 
$days = 7 
$lastWrite = $now.AddDays(-$days) 

Get-ChildItem $targetFolder -Recurse | Where-Object { $_ -is [System.IO.FileInfo] } | ForEach-Object { 
If ($_.LastWriteTime -lt $lastWrite) 
{ 
    $_ | New-Zip $($destinationFolder + $_.BaseName + ".zip") 
    $_ | Add-Zip $($destinationFolder + $_.BaseName + ".zip") 
} 
} 

Get-ChildItem $targetFolder -Recurse -Include "*.dat", "*.xml" | WHERE {($_.CreationTime -le $(Get-Date).AddDays(-$days))} | Remove-Item -Force 

这个脚本确实工作得相当好,因为它归档文件,并将其复制在目标文件夹。

如果我有℃的结构:\源\ bigfolder \ logfile.dat,所产生的压缩文件不会得到的文件夹结构,因为我想:

logfile.zip> bigfolder>日志.DAT

相反,它只是得到:logfile.zip> logfile.dat

可以搞清楚了这一点别人的帮助?

为了更好地调整它,我想如果可能的话建立一些逻辑,所以文件只有在满足特定条件时才被压缩。

,我压缩原始日志文件有一个命名惯例如下:

Folders: 
    emstg#12_list\randomstring.xml 

Individual log files: 
    emstg#12_query_data.xml 
    emstg#12_events_cache.dat etc... 

正如你可以看到这些文件的开始一样的是emstg#号。

如何在上面的脚本中实现“名称检测”机制?

感谢

您可以通过使用[System.IO.Compression] 压缩文件夹我写了这基于你的脚本。 我的想法是将需要压缩的文件的整个文件夹结构复制到临时文件夹中,然后压缩该临时文件夹。 对于名称检测,你只需要另一个where-object(修改代码,只要你想)

function Zip 
    { 
    param(
     [string]$source, 
     [string]$des 
    ) 
    add-type -AssemblyName System.IO.Compression.FileSystem 
    [System.IO.Compression.ZipFile]::CreateFromDirectory($source,$des,'Optimal',$true) 
    Start-sleep -s 1 
} 


$targetFolder = "C:\source" 
$destinationFolder = "C:\destination" 
$temp = "C:\temp" 
$now = Get-Date 
$days = 7 
$lastWrite = $now.AddDays(-$days) 
$i = 1 

Get-ChildItem $targetFolder -Recurse | Where-Object { $_ -is [System.IO.FileInfo] } | Where-Object {$_ -like "*.*"} | ForEach-Object { 
    If ($_.LastWriteTime -lt $lastWrite) { 
     $halfDir = $_.DirectoryName.Trim($targetFolder) 
     $s = $temp + "\" + $i + "\" + $halfDir 
     $d = $destinationFolder + "\" + $_.BaseName + ".zip" 
     Copy-Item $_.DirectoryName -Destination $s 
     Copy-Item $_.FullName -Destination $s 
     Zip -source $s -des $d 
     $i++ 
    } 
} 
+0

THX,一些错误 如果我有一个文件夹和多个文件相同的命名约定在文件名的开始,如** D:\ source \ emstg#12 \ string.xml **(文件夹&文件),然后单个文件:** D:\ source \ emstg#12_data.xml **或** D:\ source \ emstg# 12_events.dat **,由于类似的名称导致错误:**使用“4”参数调用“CreateFromDirectory”的异常:“文件'D:\ destination \ esmstg#12.zip'已经存在。”* *临时文件也不会被删除。 修改后的代码是:..... ..... | Where-Object {$ _ -like“esmstg#12 *”} | ForEach-Object {' ZIP应该保持相同的文件夹/文件结构 – valdroni