我有许多IIS服务器,每个服务器上都有许多站点,我希望定期压缩所有IIS日志。
在这个站点和google的帮助下,我拼凑了以下powershell脚本:
$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。
发布于 2020-02-10 21:16:51
您可能希望使用"Start-Process -Wait“,而不是使用&。在Start进程上使用-Wait标志会迫使它等待完成,然后会导致您的程序按顺序运行。检查本文中关于如何使用启动进程:一个更好的PowerShell启动过程,您可能也希望使用,而不是命令行程序Winrar,后者可能会更好地集成,并在脚本中提供更好的反馈。
像WinRAR这样的东西吗?
$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
}或者用压缩档案
$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"
{以上这些都是未经测试的,但除非我做了一个错误,否则应该可以工作。
发布于 2020-02-11 01:39:05
为了测试目的,我创建了一个LogFolder,它有三个独立的日志文件夹,Log1、Log2和Log3。每个日志文件夹都有2000个文件,每个文件有2MB的数据。这是我运行的命令,用于分别压缩每个文件夹
如果性能太慢(从同一个磁盘读取和写入相同的磁盘),您也可以串行地运行这些操作。
$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输出接收
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 PMhttps://stackoverflow.com/questions/60158359
复制相似问题