【发布时间】:2018-11-09 15:08:07
【问题描述】:
有时会创建日志 (.txt) 文件,这些文件太大而无法打开 (5GB+),我需要创建一个解决方案来拆分成更小的可读块,以便在写字板中使用。这是在 Windows Server 2008 R2 中。
我需要一个批处理文件、powerShell 或类似的解决方案。理想情况下,应该硬编码每个文本文件包含不超过 999 MB 并且不会停在一行中间。
我在https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Split-large-log-6f2c4da0 找到了一个与我的需求类似的解决方案,有时(按行数)可以工作
#############################################
# Split a log/text file into smaller chunks #
#############################################
# WARNING: This will take a long while with extremely large files and uses lots of memory to stage the file
# Set the baseline counters
# Set the line counter to 0
$linecount = 0
# Set the file counter to 1. This is used for the naming of the log files
$filenumber = 1
# Prompt user for the path
$sourcefilename = Read-Host "What is the full path and name of the log file to split? (e.g. D:\mylogfiles\mylog.txt)"
# Prompt user for the destination folder to create the chunk files
$destinationfolderpath = Read-Host "What is the path where you want to extract the content? (e.g. d:\yourpath\)"
Write-Host "Please wait while the line count is calculated. This may take a while. No really, it could take a long time."
# Find the current line count to present to the user before asking the new line count for chunk files
Get-Content $sourcefilename | Measure-Object | ForEach-Object { $sourcelinecount = $_.Count }
#Tell the user how large the current file is
Write-Host "Your current file size is $sourcelinecount lines long"
# Prompt user for the size of the new chunk files
$destinationfilesize = Read-Host "How many lines will be in each new split file?"
# the new size is a string, so we convert to integer and up
# Set the upper boundary (maximum line count to write to each file)
$maxsize = [int]$destinationfilesize
Write-Host File is $sourcefilename - destination is $destinationfolderpath - new file line count will be $destinationfilesize
# The process reads each line of the source file, writes it to the target log file and increments the line counter. When it reaches 100000 (approximately 50 MB of text data)
$content = get-content $sourcefilename | % {
Add-Content $destinationfolderpath\splitlog$filenumber.txt "$_"
$linecount ++
If ($linecount -eq $maxsize) {
$filenumber++
$linecount = 0 } }
# Clean up after your pet
[gc]::collect()
[gc]::WaitForPendingFinalizers
()
但是,当我运行它时,我在 powershell 中遇到许多错误,类似于:
Add-Content : The process cannot access the file 'C:\Desktop\splitlog1.txt'
because it is being used by another process...
所以我请求帮助修复上述代码,或者请帮助创建不同/更好的解决方案。
【问题讨论】:
-
避免如此庞大的日志文件,您可能会对LogRotateWin... 感兴趣
-
@aschipfl 我很欣赏你的建议,但是这对我来说并没有真正的帮助。
-
我一直使用源自同一篇文章的脚本,没有任何问题。根据您看到的错误,您可能在其他地方打开了目标文件。您是否在另一个 shell 中运行“Get-Content split-log1.txt -tail”?
标签: windows powershell batch-file split