gpt4 book ai didi

powershell - 将日志记录快速添加到现有的一组 powershell 脚本中

转载 作者:行者123 更新时间:2023-12-02 23:39:42 26 4
gpt4 key购买 nike

我有一组 powershell 脚本,其中一些调用其他脚本。其中一些下标也可以根据需要自行调用。如何快速将日志记录添加到所有脚本中,以便任何脚本调用都会生成日志文件以供以后检查?

有许多关于日志记录的问题有一些很好的答案,like this one .但我想看看我们能想出什么:

  • 需要对现有的 powershell 文件进行最少的改动
  • 自动处理脚本 A.ps1 调用脚本 B.ps1。如果你打电话
    A.ps1,A.ps1 需要开始和结束日志记录。但是如果你调用 B.ps1
    直接,B.ps1 可以。

  • 我在下面提出了我的答案,并想分享一下,看看是否有其他关于如何解决这个问题的想法,或者对我的答案进行改进的建议。

    最佳答案

    我编写的支持代码(进一步向下)只允许将以下内容添加到每个 ps1 文件中。无论脚本是在顶层调用还是由另一个脚本调用,它都会自动为我提供日志记录:

    #any params for script
    . "$PSScriptRoot\ps_support.ps1"
    StartTranscriptIfAppropriate
    try
    {
    #all of the original script
    }
    finally
    {
    ConditionalStopTranscript
    }

    支持此功能的代码位于 ps_support.ps1 中,位于我需要记录的 powershell 文件集合旁边。它使用 Get-Variable 和 Set-Variable 在调用者的作用域级别操作几个变量:
  • Logging__TranscriptStarted是正常的,所以子范围可以看到
    日志记录已经发生,不要尝试再次启动它。
  • Logging__TranscriptStartedPrivate是私有(private)的,因此范围可以知道是否
    它负责停止记录。

  • 这是 ps_support.ps1:
    Set-Variable -name TranscriptStartedPropertyName -opt ReadOnly -value 'Logging__TranscriptStarted'
    Set-Variable -name TranscriptStartedPrivatePropertyName -opt ReadOnly -value 'Logging__TranscriptStartedPrivate'

    function StartTranscriptIfAppropriate
    {
    $transcriptStarted = [bool](Get-Variable -name $TranscriptStartedPropertyName -ErrorAction Ignore)
    if (-not $transcriptStarted)
    {
    $callstack = get-pscallstack
    $fullPath = $callstack[$callstack.count-2].ScriptName
    $name = Split-Path -Path $fullPath -Leaf
    $directory = Split-Path -Path $fullPath
    $logDirectory = [IO.Path]::GetFullPath("$directory\..\scripts_logs")
    md -force $logDirectory | out-null
    $logFinalPath = "$logDirectory\$(Get-Date -Format o | foreach {$_ -replace ":", "."})_$name.log"
    Set-Variable -scope 1 -name $TranscriptStartedPropertyName -value $True
    Set-Variable -scope 1 -option private -name $TranscriptStartedPrivatePropertyName -value $True
    Start-Transcript $logFinalPath | Write-Host
    }
    $immediateCallerPath = Get-Variable -scope 1 -name PSCommandPath -ValueOnly
    Write-Host "Starting script at $immediateCallerPath"
    }

    function ConditionalStopTranscript
    {
    $immediateCallerPath = Get-Variable -scope 1 -name PSCommandPath -ValueOnly
    Write-Host "Stopping script at $immediateCallerPath"
    $transcriptStartedByMe = [bool](Get-Variable -scope 1 -name $TranscriptStartedPrivatePropertyName -ErrorAction Ignore)
    if ($transcriptStartedByMe)
    {
    Stop-Transcript | Write-Host
    }
    }

    关于powershell - 将日志记录快速添加到现有的一组 powershell 脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496274/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com