Переименовать файл журнала на удаленных компьютерах, если он больше 80 МБ

#powershell

#powershell

Вопрос:

Я хочу переименовать файл журнала на удаленных компьютерах, как только он достигнет 80 МБ. В качестве примера, допустим, это путь «C:Program Files Test Folder TCP.Log», если он превышает 80 МБ, то его следует переименовать в TCP1.log. После переименования система автоматически сгенерирует новый файл журнала с именем «TCP.log» (система сгенерирует его автоматически, как только вы переименуете или удалите его). Как только TCP.log снова достигнет 80 МБ, powershell должен переименовать его в TCP2.Log, как я могу это сделать?

Я пробовал этот скрипт, он переименует его в TCP1.Log, но как только я снова его запущу, он скажет, что файл уже существует, поэтому он не переименовывает его в TCP2.LOG .

введите описание изображения здесь

В идеале я хотел бы создать запланированную задачу, которая будет выполняться и переименовывать файл TCP.log, если он превышает 80 МБ на удаленных компьютерах.

Комментарии:

1. пожалуйста, НЕ РАЗМЕЩАЙТЕ ИЗОБРАЖЕНИЯ КОДА. [ нахмурившись ] опубликуйте текст … в противном случае вы требуете, чтобы другие вводили ваш код, просто чтобы попытаться вам помочь. довольно недобро с вашей стороны, да? [ усмешка ]

Ответ №1:

Я думаю, что служебная функция может помочь в подобных ситуациях:

 function Rename-Unique {
    # Renames a file. If a file with that name already exists,
    # the function will create a unique filename by appending 
    # a sequence number to the name before the extension.
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string]$Path
    )
    # Throw a bit nicer error than with [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
    if (!(Test-Path -Path $Path -PathType Leaf)){
       Throw [System.IO.FileNotFoundException] "Rename-Unique: The file '$Path' could not be found."
    }

    # split the filename into a basename and an extension variable
    $baseName  = [System.IO.Path]::GetFileNameWithoutExtension($Path)
    $extension = [System.IO.Path]::GetExtension($Path)    # this includes the dot
    $folder    = Split-Path -Path $Path -Parent

    # get an array of all filenames (name only) of the files with a similar name already present in the folder
    $allFiles = @(Get-ChildItem $folder -Filter "$baseName*$extension" -File | Select-Object -ExpandProperty Name)
    # for PowerShell version < 3.0 use this
    # $allFiles = @(Get-ChildItem $folder -Filter "$baseName*$extension" | Where-Object { !($_.PSIsContainer) } | Select-Object -ExpandProperty Name)

    # construct the new filename / strip the path from the file name
    $newName = $baseName   $extension   # or use $newName = Split-Path $newName -Leaf

    if ($allFiles.Count) {
        $count = 1
        while ($allFiles -contains $newName) {
            $newName = "{0}{1}{2}" -f $baseName, $count  , $extension
        }
    }
    Write-Verbose "Renaming '$Path' to '$newName'"
    Rename-Item -Path $Path -NewName $newName -Force
}
  

В вашем коде вы можете использовать его следующим образом:

 $logfile    = 'C:Program FilesTest FolderTCP.Log'   # this is your current log file
$maxLogSize = 80MB                                     # the maximum size in bytes you want

# check if the log file exists
if (Test-Path -Path $logfile -PathType Leaf) {
    # check if the logfile is at its maximum size
    if ((Get-Item -Path $logfile).Length -ge $maxLogSize) {
        # rename the current log file using the next sequence number
        Rename-Unique -Path $logfile -Verbose
        # do we need to create the new log file?
        # New-Item -Path $logfile -ItemType 'File' -Force | Out-Null
    }
}
  

Комментарии:

1. Я попробовал сценарий, и он сработал 🙂 , все, что мне нужно сделать, это либо создать запланированную задачу для запуска на каждом компьютере, либо настроить таргетинг на все компьютеры из централизованного расположения. Спасибо!!!

Ответ №2:

То же самое, что сказал Lee_Daily.

Что касается вашего кода. На самом деле вы ничего не делаете, чтобы получить приращение, поэтому оно выдаст вам то же число, отсюда и ошибка.

Просто получите количество имен файлов, затем увеличьте количество на единицу для переименования. Если вы говорите, что имя базового файла всегда одно и то же, то вам вообще нужен этот цикл.

Пример:

 # Check for similarly named files
Get-ChildItem -Path 'E:tempReportsTCP*'

# Results

    Directory: E:tempReports


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       12/29/2018   1:10 PM             38 TCP.log
-a----       12/29/2018   1:10 PM             38 TCP1.log
-a----        3/14/2019  12:27 PM             45 TCP2.log
-a----       12/29/2018   2:31 PM             34 TCP3.log

# Rename the file that does not have a number with the next highest number of the count of the similarly named file.
Rename-Item -Path E:TempReportsTCP.log -NewName "TCP$((Get-ChildItem -Path E:tempReportstcp*).Count).log" -WhatIf

# Results

What if: Performing the operation "Rename File" on target "Item: E:TempReportsTCP.log Destination: E:TempReportsTCP4.log".