我目前正在学习Powershell,并负责制作日志轮换脚本。
我的工作几乎已经完成,但我仍然需要一个脚本来将日志文件移动到正确的文件夹中。
要求:我有一个目录" XY:\" Powershell脚本转储的地方" * .log"脚本应该获取这些文件并将其移动到另一个目录" Z:\",将其复制到文件夹结构中最新的子目录中。
###############Logrotationsskript###############
#-Splittung bei Übergröße in mehrere .log-Files#
#-Timestamp im Filename #
#-Archivierung der Logs in Timestampfolder #
#-Löschung veralteter Logfiles #
#-Leerung der Quelllog nach backup #
################################################
############################## Parameter ##############################
$sw = new-object System.Diagnostics.Stopwatch
$sw.Start() # Timer startet
$filename = "D:\Test\WindowsUpdate.log" # Angabe des Pfads wo die Quell Logdatei ablegt ist.
$rootName = "D:\backup-logs\Apache2_Lognummer_" # Dateipfad\Dateiname
$ext = ".log" # Dateiendung
$linesperFile = 10000 # Dateigröße (Zeilen) ab wann die Splittung erfolgen soll
$path = "D:\backup-logs\" # Log Verzeichnis
$DateNow = ((Get-date).Day).ToString()+"-"+`
((Get-date).Month).ToString()+"-"+`
((Get-date).Year).ToString()+"-"+`
((Get-date).Hour).ToString()+"-"+`
((Get-date).Minute).ToString()+"-"+`
((Get-date).Second).ToString()+".log" # Ermittelt das aktuelle Datum (Deutscher Timestamp Tag-Monat-Jahr-Stunde-Minute-Sekunde !)
$filecount = 1 # Namenszähler
$reader = $null
############################ Skript Start ############################
try{
$reader = [io.file]::OpenText($filename)
try{
"Creating file number $filecount"
$writer= [system.io.directory]::CreateDirectory("D:\backup-logs\$DateNow")
$writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
$filecount++
$linecount = 0
while($reader.EndOfStream -ne $true) {
"Reading $linesperFile"
while( ($linecount -lt $linesperFile) -and ($reader.EndOfStream -ne $true)){
$writer.WriteLine($reader.ReadLine());
$linecount++
}
if($reader.EndOfStream -ne $true) {
"Closing file"
$writer.Dispose();
"Creating file number $filecount"
$writer= [system.io.directory]::CreateDirectory("D:\backup-logs\$DateNow")
$writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
$filecount++
$linecount = 0
}
}
} finally {
$writer.Dispose();
}
} finally {
$reader.Dispose();
}
####################### Veraltete Verzeichnisse und Logdateien löschen/leeren #######################
$limit = (Get-Date).AddDays(-60) # Anzahl Tage bis Löschung
# Lösche Dateien älter als $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Löscht leere Verzeichnisse -- > Auskommentieren
#Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
Clear-Content $filename # Löscht alten Inhalt der .Logfile ($filename siehe oben) nachdem diese gebackupt wurde.
#####################################################################################################
$sw.Stop() # Timer stoppt
Write-Host "Backup complete in " $sw.Elapsed.TotalSeconds "seconds" # Ausgabe des Timers über die Kommandozeile
############################ Skript Ende ############################
有人可以帮助我实现这个小脚本吗?
文件和文件夹以时间戳命名,因此应将最新的日志文件复制到当前时间戳文件夹中。
答案 0 :(得分:0)
要求:我有一个目录“XY:\”,其中Powershell脚本转储“* .log”文件。脚本应该获取这些文件并将其移动到另一个目录“Z:\”,将其复制到存在于文件夹结构中的最新子目录。
根据您的要求,您可以做类似的事情
$mostRecentSubDir = Get-ChildItem Z:\ | Where-Object { $_.psiscontainer } | Sort-Object CreationTime -Descending | Select-Object -first 1
Robocopy XY:\ Z:\$mostRecentSubDir *.log