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