将日志文件复制到正确的文件夹

时间:2016-03-09 14:14:41

标签: powershell

我目前正在学习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 ############################

有人可以帮助我实现这个小脚本吗?

文件和文件夹以时间戳命名,因此应将最新的日志文件复制到当前时间戳文件夹中。

1 个答案:

答案 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