gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:57:41 25 4
gpt4 key购买 nike

我想使用 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 相同。

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

谢谢

最佳答案

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

关于Powershell 压缩文件夹和文件,然后删除旧文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com