Я работаю над полным переписыванием своей функции ведения журнала, которую я использую для пары сотен сценариев, и пытаюсь сделать ее максимально надежной. Я пытаюсь сделать так, чтобы он был в состоянии создать, пройти через очень простой набор проверок, чтобы найти первый доступный журнал, в который он может записать.
Я пытаюсь записать его, чтобы он пытался записать в каждый файл журнала (в случае, если файлы имеют разрешения, отличные от каталогов)
Логический путь
- Пройдите по каждому каталогу в списке
- Посмотрите, есть ли какие-нибудь журналы, которые я могу добавить к
- Если к ним добавляется
- Если нет, попробуйте создать новый журнал с добавлением
#
.
- Если не удается создать новый журнал, перейдите к следующему каталогу
Этот сценарий не очень сложный, я написал гораздо более сложные сценарии, но по какой-то причине мой мозг не будет обдумывать это, и я продолжаю придумывать неокрепшие, очень повторяющиеся функции, и я пытаюсь сохранить эффективность и скорость как наиболее важный приоритет.
Function TestLogger {
$WriteTee = @{}
$WriteTee.LogName = 'WriteTee.log'
#$WriteTee.LogName = "$(((Split-Path -Leaf $script:MyInvocation.MyCommand.Definition)).BaseName).txt"
$WriteTee.LogPaths = "C:\Windows\",
'C:\Users\1151577373E\Documents\Powershell Scripts\AutoUpdater\',
"$Env:UserProfile"
#"$(Split-Path -Parent $script:MyInvocation.MyCommand.Definition)"
foreach ($Path in $WriteTee.LogPaths) {
$Path = [System.IO.DirectoryInfo]$Path
#Ensure the directory exists and if not, create it.
if (![System.IO.Directory]::Exists($Path)) {
try {
New-Item -Path $Path.Parent.FullName -Name $Path.BaseName -ItemType 'Directory' -ErrorAction Stop -Force | Out-Null
} catch {
continue
}
}
#Check to see if there are any existing logs
$WriteTee.ExistingLogs = Get-ChildItem -LiteralPath $Path -Filter "$(([System.IO.FileInfo]$WriteTee.LogName).BaseName)*$(([System.IO.FileInfo]$WriteTee.LogName).Extension)" |Sort-Object
if ($WriteTee.ExistingLogs.Count -eq 0) {
$WriteTee.LastLogName = $null
} else {
foreach ($ExistingLog in $WriteTee.ExistingLogs) {
try {
[IO.File]::OpenWrite($ExistingLog.FullName).close() | Out-Null
$WriteTee.LogFile = $ExistingLog.FullName
break
} catch {
$WriteTee.LastLogName = $ExistingLog
continue
}
}
}
#If no previous logs can be added to create a new one.
if (-not $WriteTee.ContainsKey('LogFile')) {
switch ($WriteTee.LastLogName.Name) {
{$_ -eq $Null} {
$WriteTee.ExistingLogs.count
Write-Host Create New File
}
{$_ -match '.*\[[0-9]+\]\.'} {
Write-Host AAAAAA
$WriteTee.NextLogName = $WriteTee.NextLogName.FullName.Split('[]')
$WriteTee.NextLogName = $WriteTee.NextLogName[0] + "[" + ([int]($WriteTee.NextLogName[1]) + 1) + "]" + $WriteTee.NextLogName[2]
}
default {}
}
}
#Determine if log file is available or not.
if ($WriteTee.ContainsKey('LogFile')) {
Write-Host "Function Success"
break
} else {
continue
}
}
return $WriteTee.LogFile
}
clear
TestLogger