找到第一个可用于输出日志的文件

时间:2018-05-03 20:03:23

标签: powershell

我正在完全重写我的日志记录功能,我使用了几百个脚本,并且我试图让它尽可能健壮。我试图让它能够创建一个非常基本的检查集来查找它可以写入的第一个可用日志。

我正在尝试写它,所以它会尝试写入每个日志文件(如果文件的permisisons不同于目录)

逻辑路径

  • 浏览列表中的每个目录
  • 查看我是否可以添加任何日志
  • 如果附加给他们
  • 如果没有,请尝试创建一个附加DataIntegrityViolationException的新日志。
  • 如果无法创建新日志,请转到下一个目录

这个脚本不是很难,我编写了更复杂的脚本,但由于某种原因,我的大脑不会围绕这个,我不断提出非强大的非常重复的功能,我试图保持效率和速度是最重要的优先事项。

#

1 个答案:

答案 0 :(得分:0)

我想我周六就把自己烧掉了,晚安让我再次入睡。这是我最终的结果,真的希望别人能从中找到一些用处。

Function TestLogger {
    $WriteTee = @{}
    $WriteTee.LogName  = 'WriteTee.log'
    #$WriteTee.LogName  = "$(((split-path -leaf $Script:MyInvocation.MyCommand.Definition)).BaseName).Log"
    $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) {
        If ($WriteTee.ContainsKey('LogFile')) { Break }
        $Path = [System.IO.DirectoryInfo]$Path
        #Ensure the directory exists and if not, create it.
        If (![System.IO.Directory]::Exists($Path)) {
            Try {
                #Create the directory because .Net will error out if you try to create a file in a directory that doesn't exist yet.
                New-Item -Path $Path.Parent.FullName -Name $Path.BaseName -ItemType 'Directory' -ErrorAction Stop -Force |Out-Null
            } Catch {
                Continue
            }
        }#End-If

        #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 -GT 0) {
            ForEach ($ExistingLog in $WriteTee.ExistingLogs) {
                Try {
                    [io.file]::OpenWrite($ExistingLog.FullName).close() |Out-Null
                    $WriteTee.LogFile = $ExistingLog.FullName
                    break
                } Catch {
                    $WriteTee.LastLogName = $ExistingLog
                    Continue
                }
            }
        }#End-If

        #If no previous logs can be added to create a new one.
        switch ($WriteTee.ExistingLogs.Count) {
            {$PSItem -EQ 0} {
                $WriteTee.TestLogFile = Join-Path -Path $Path -ChildPath $WriteTee.LogName
            }
            {$PSItem -EQ 1} {
                $WriteTee.TestLogFile = Join-Path -Path $Path -ChildPath ($WriteTee.LastLogName.basename + '[0]' + $WriteTee.LastLogName.Extension)
            }

            {$PSItem -GE 2} {
                $WriteTee.TestLogFile = $WriteTee.LastLogName.FullName.Split('[]')
                $WriteTee.TestLogFile = ($WriteTee.TestLogFile[0] + '[' + (([int]$WriteTee.TestLogFile[1]) + 1) + ']' + $WriteTee.TestLogFile[2])
            }
            Default {
                Write-Host "If you are looking for an explanation of how you got here, I can tell you I don't have one. But what I do have are a very particular lack of answers that I have aquired over a very long career that make these problems a nightmare for people like me."
                Continue
                }
        }#End-Switch

        #Last but not least, try to create the file and hope it is successful.
        Try {
            [IO.File]::Create($WriteTee.TestLogFile, 1, 'None').close() |Out-Null
            $WriteTee.LogFile = $WriteTee.TestLogFile
            Break
        } Catch {
            Continue
        }
    }#End-ForEach
    Return $WriteTee.LogFile

}