powershell

Script to generate Logrotationscript


I like to edit a little Parameter more to it. Now it is splitting the File every $linesperfile but I want to add in the params $split which should be a Boolean. it should split it every $linesperfile or leave in in only one file .. I tried it already but every time it's ending in a permanent loop.

call.ps1

D:\powershell.ps1 -filename "D:\Test\WindowsUpdate.log" -rootName "D:\backup-logs\Apache2_Lognummer_" -ext ".log" -linesperFile 10000 -path "D:\backup-logs\" -split "true"

powershell.ps1

param(
    [Parameter(Mandatory=$true,Position=0)]
    [string]$filename,

    [Parameter(Mandatory=$true,Position=1)]
    [string]$rootName,

    [Parameter(Mandatory=$true,Position=2)]
    [string]$ext,

    [Parameter(Mandatory=$true,Position=3)]
    [string]$linesperFile,

    [Parameter(Mandatory=$true,Position=4)]
    [string]$path,

    [Parameter(Mandatory=$true,Position=5)]
    [string]$split
)

############################## Parameter ##############################

$sw = new-object System.Diagnostics.Stopwatch
$sw.Start() # Timer startet


$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("$path\$DateNow")
        $writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
        $linecount = 0
        $filecount++

        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("$path\$DateNow") 
                $writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
                $filecount++
                $linecount = 0
            }
        }
    } finally {
        $writer.Dispose();
    }
} finally {
    $reader.Dispose();
}

############################ Logfile verschieben ############################

$mostRecentSubDir = Get-ChildItem $path\ | Where-Object { $_.psiscontainer } | Sort-Object CreationTime -Descending | Select-Object -first 1
Robocopy $path $path\$mostRecentSubDir *.log /move

#Remove-Item $path | Where-Object name -like "*.log"

####################### 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 -- > Uncomment 
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 stops

Write-Host "Backup complete in " $sw.Elapsed.TotalSeconds "seconds" # Ausgabe des Timers über die Kommandozeile


############################ Skrict End ############################

Solution

  • So all you have to do is to add a param block at the start of your script and define your parameters:

    param(
        [Parameter(Mandatory=$true,Position=0)]
        [string]$filename,
    
        [Parameter(Mandatory=$true,Position=1)]
        [string]$rootName,
    
        [Parameter(Mandatory=$true,Position=2)]
        [string]$ext,
    
        [Parameter(Mandatory=$true,Position=3)]
        [string]$linesperFile,
    
        [Parameter(Mandatory=$true,Position=4)]
        [string]$path
    )
    
    ############################## Parameter ##############################
    
    $sw = new-object System.Diagnostics.Stopwatch
    $sw.Start() # Timer startet
    
    
    $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("$path\$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("$path\$DateNow") 
                    $writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
                    $filecount++
                    $linecount = 0
                }
            }
        } finally {
            $writer.Dispose();
        }
    } finally {
        $reader.Dispose();
    }
    
    ############################ Logfile verschieben ############################
    
    $mostRecentSubDir = Get-ChildItem $path\ | Where-Object { $_.psiscontainer } | Sort-Object CreationTime -Descending | Select-Object -first 1
    Robocopy $path $path\$mostRecentSubDir *.log /move
    
    #Remove-Item $path | Where-Object name -like "*.log"
    
    ####################### 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 -- > Uncomment 
    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 stops
    
    Write-Host "Backup complete in " $sw.Elapsed.TotalSeconds "seconds" # Ausgabe des Timers über die Kommandozeile
    
    
    ############################ Skrict End ############################