生成Logrotationscript

时间:2016-03-17 13:22:37

标签: powershell

我想更多地编辑一个参数。现在它将每个$ linesper文件拆分为File但我想在params中添加$ split应该是一个布尔值。它应该将每个$ linesper文件拆分或仅留在一个文件中..我已经尝试过了,但每次都以永久循环结束。

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

1 个答案:

答案 0 :(得分:0)

所以你要做的就是在脚本开头添加一个param块并定义你的参数:

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