用于拉链文件夹的Powershell&文件,然后删除旧文件

时间:2016-09-22 20:43:46

标签: powershell compression powershell-v3.0

我想使用Powershell自动化: 1.压缩超过7天的日志文件(.xml和.dat扩展名), 2.将这些压缩档案复制到别处 3.然后从源中删除原始日志文件。

我正在使用以下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

此脚本的效果相当不错,因为它只归档 文件,并将它们复制到目标文件夹中。

如果我的结构为 C:\ source \ bigfolder \ logfile.dat ,则生成的zip文件将无法获得我想要的文件夹结构:

logfile.zip> bigfolder> logfile.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#number相同。

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

由于

1 个答案:

答案 0 :(得分:1)

您可以使用[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++
    }
}