首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell -顺序前置循环压缩文件

Powershell -顺序前置循环压缩文件
EN

Stack Overflow用户
提问于 2020-02-10 21:02:07
回答 2查看 969关注 0票数 1

我有许多IIS服务器,每个服务器上都有许多站点,我希望定期压缩所有IIS日志。

在这个站点和google的帮助下,我拼凑了以下powershell脚本:

代码语言:javascript
复制
$files = Get-ChildItem  "D:\logfiles\IIS-Logs\*.log" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-7))} 
foreach ($file in $files) {& 'C:\Program Files\WinRAR\winrar.exe' a -tl -df -m5 "$file.rar" $File}

这个脚本的问题是如果有..。说..。它试图同时启动2,000个Winrar的日志文件,服务器将崩溃。这真是出乎意料。我希望它一次只能压缩一个文件。按顺序排列。

有人有什么办法让这件事像我想的那样运作吗?

我非常想使用Winrar与本机压缩存档选项,因为:

  • 我希望文件日期反映压缩的文件,而不是压缩的日期。
  • 我希望实用程序在归档后删除文件,因为如果归档失败,该实用程序将不会删除该文件。

如果我能用另一种方式实现这一点,我就不会嫁给Winrar。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-10 21:16:51

您可能希望使用"Start-Process -Wait“,而不是使用&。在Start进程上使用-Wait标志会迫使它等待完成,然后会导致您的程序按顺序运行。检查本文中关于如何使用启动进程:一个更好的PowerShell启动过程,您可能也希望使用,而不是命令行程序Winrar,后者可能会更好地集成,并在脚本中提供更好的反馈。

像WinRAR这样的东西吗?

代码语言:javascript
复制
$files = Get-ChildItem  "D:\logfiles\IIS-Logs\*.log" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-7))}
foreach ($file in $files) {
    $args = 'a -tl -df -m5 "' + $file.rar + '" ' + $File
    Start-Process -Wait -filepath 'C:\Program Files\WinRAR\winrar.exe' -ArgumentList $args
}

或者用压缩档案

代码语言:javascript
复制
$files = Get-ChildItem  "D:\logfiles\IIS-Logs\*.log" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-7))}
foreach ($file in $files) {
    Compress-Archive -Path $file.FullName -DestinationPath "$($File.FullName).rar"
{

以上这些都是未经测试的,但除非我做了一个错误,否则应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2020-02-11 01:39:05

为了测试目的,我创建了一个LogFolder,它有三个独立的日志文件夹,Log1、Log2和Log3。每个日志文件夹都有2000个文件,每个文件有2MB的数据。这是我运行的命令,用于分别压缩每个文件夹

如果性能太慢(从同一个磁盘读取和写入相同的磁盘),您也可以串行地运行这些操作。

代码语言:javascript
复制
$ElementsInLog = (Get-ChildItem C:\temp\LogFolder\*.txt -Recurse).Length
$ElementsInLog1 = (Get-ChildItem C:\temp\LogFolder\Log1\*.txt -Recurse).Length
$ElementsInLog2 = (Get-ChildItem C:\temp\LogFolder\Log2\*.txt -Recurse).Length
$ElementsInLog3 = (Get-ChildItem C:\temp\LogFolder\Log3\*.txt -Recurse).Length

Write-Output "Main: $ElementsInLog`nLog1: $ElementsInLog1`nLog2: $elementsInLog2`nLog3: $elementsInLog3"
Write-output "Total File Size: $((Get-ChildItem C:\temp\LogFolder\Log1\*.txt -Recurse | Measure-Object length -Sum).Sum / 1024 / 1024 / 1024) GB"


Write-Output "Starting Tasks..."

$job1 = Start-Job -ScriptBlock {
  Write-Output "Log1: $(Get-Date -Format G)"
  Get-ChildItem C:\temp\LogFolder\Log1 -Recurse | Compress-Archive -DestinationPath C:\temp\log1.zip -CompressionLevel Fastest
  Write-Output "Finished: $(Get-Date -Format G)"
}

$job2 = Start-Job -ScriptBlock {
    Write-Output "Log2: $(Get-Date -Format G)"
    Get-ChildItem C:\temp\LogFolder\Log3 -Recurse | Compress-Archive -DestinationPath C:\temp\log3.zip -CompressionLevel Fastest
    Write-Output "Finished: $(Get-Date -Format G)"
}

$job3 = Start-Job -ScriptBlock {
    Write-Output "Log2: $(Get-Date -Format G)"
    Get-ChildItem C:\temp\LogFolder\Log4 | Compress-Archive -DestinationPath C:\temp\log4.zip -CompressionLevel Fastest
    Write-Output "Finished: $(Get-Date -Format G)"
}

while($job1.State -eq "Running" -or $job2.State -eq "Running" -or $job3.State -eq "Running") { 
    Start-Sleep 5
}

Receive-Job $job1
Receive-Job $job2
Receive-Job $job3

输出接收

代码语言:javascript
复制
Main: 8000
Log1: 2000
Log2: 2000
Log3: 2000
Total File Size: 4.12791967391968 GB

Starting Tasks...
Log1: 2/10/2020 8:36:22 PM
Finished: 2/10/2020 8:37:30 PM
Log2: 2/10/2020 8:36:22 PM
Finished: 2/10/2020 8:37:27 PM
Log3: 2/10/2020 8:36:22 PM
Finished: 2/10/2020 8:37:28 PM
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60158359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档