【问题标题】:How to generate comprehensive log file from PowerShell script如何从 PowerShell 脚本生成综合日志文件
【发布时间】:2018-03-16 17:02:31
【问题描述】:

我正在尝试编写迁移/部署脚本以将应用程序部署到环境(DEV、QA、PROD),并且我需要能够完全记录所有输出。这将包括我专门放在输出流中的任何状态消息(不是问题)以及所有命令的详细输出。例如,如果我打电话给Copy-Item,我希望复制每个项目的完整列表。

我正在尝试找出一种方法在整个脚本中可靠地执行此操作。换句话说,我不想依赖在每个命令中都包含-Verbose(因为将来其他人维护脚本时可能会错过它)。我一直在研究$VerbosePreference 之类的东西,以及使用-Verbose 调用我的主要cmdlet/函数的可能性,希望这两种方法都适用于整个脚本。但情况似乎并非如此。虽然我使用的任何Write-Verbose 命令都尊重这两种方法,但如果我专门将-Verbose 传递给它,则对Copy-Item 的调用只会显示详细列表。我真的希望我只是错过了一些东西!这当然可以做我想做的事!

示例代码:

function Main () {
    [CmdletBinding()]
    Param()

    Begin {
        Copy-Item C:\Temp\src\* -Destination C:\Temp\dest -Recurse -Force
        Write-Output 'Main output'
        Write-Verbose 'Main verbose'
        Child
    }
}
function Child () {
    [CmdletBinding()]
    Param()

    Begin {
        Copy-Item C:\Temp\src\* -Destination C:\Temp\dest -Recurse -Force
        Write-Output 'Child output'
        Write-Verbose 'Child verbose'
    }
}

$VerbosePreference = 'SilentlyContinue'
Write-Output $VerbosePreference
Main
''
Main -Verbose

''
''
$VerbosePreference = 'Continue'
Write-Output $VerbosePreference
Main
''
Main -Verbose

产生输出:

SilentlyContinue
Main output
Child output

Main output
VERBOSE: Main verbose
Child output
VERBOSE: Child verbose


Continue
Main output
VERBOSE: Main verbose
Child output
VERBOSE: Child verbose

Main output
VERBOSE: Main verbose
Child output
VERBOSE: Child verbose

所以,显然$VerbosePreference-Verbose 正在影响Write-Verbose,但仅此而已。 Copy-Item 不显示任何输出(尽管如果我专门在该命令上直接使用 -Verbose 会显示)。

有什么想法吗?我对这一切都错了吗?请帮忙!

【问题讨论】:

    标签: powershell logging deployment


    【解决方案1】:

    如何利用...

    提示:创建您在 Windows PowerShell 中所做操作的脚本

    PowerShell 控制台包含一个脚本功能来帮助您 在提示时记录您的所有活动。在撰写本文时,您 无法在 PowerShell 应用程序中使用此功能。命令你 与成绩单一起使用包括以下内容:

    https://technet.microsoft.com/en-us/library/ff687007.aspx

    ...或此处提供/详述的方法:

    增强的脚本日志记录模块(自动控制台输出捕获到 文件)

    自动将 PowerShell 控制台输出复制到日志文件(从 输出、错误、警告、详细和调试流),同时仍然 在控制台显示输出。日志文件输出是前置的 带有日期/时间以及来自哪个流的指示符

    https://gallery.technet.microsoft.com/scriptcenter/Enhanced-Script-Logging-27615f85

    Write-Log PowerShell 日志功能

    Write-Log PowerShell 高级功能被设计成一个简单的 其他 cmdlet、高级功能和脚本的记录器功能。 通常在运行脚本时需要记录发生的事情 什么时候。 Write-Log 接受一个字符串和一个日志文件的路径,并且 应用

    https://gallery.technet.microsoft.com/scriptcenter/Write-Log-PowerShell-999c32d0

    * 根据 OP 评论更新*

    查看此讨论...

    Powershell 在全局级别应用详细程度

    -verbose 标志不提供给 ni 命令。有没有 如果我要运行,在全局 PSSession 级别设置详细程度的方法 这个脚本强制冗长?我问的原因是我有一个 一组大约 60 个脚本,它们相互依赖,没有一个 为他们发出的任何命令提供-verbose,我想看看 当我调用主入口点 powershell 脚本时的整个输出。

    Powershell apply verbosity at a global level

    使用 PowerShell 默认参数值来简化脚本

    更改默认参数值

    当我被要求撰写关于我最喜欢的 Windows PowerShell 3.0 的文章时 功能,我的 #1 $PSDefaultParameterValues 立即浮现在脑海中。 从我的角度来看,这是我一直在寻找的东西 很久了。

    它是如何工作的?使用 $PSDefaultParameterValues,您可以定义 (覆盖)Windows PowerShell 参数的默认值 cmdlet。

    https://blogs.technet.microsoft.com/heyscriptingguy/2012/12/03/use-powershell-default-parameter-values-to-simplify-scripts/

    另见:

    脚本跟踪和日志记录

    虽然 Windows PowerShell 已经有 LogPipelineExecutionDetails 用于记录 cmdlet 调用的组策略设置,PowerShell 的 脚本语言有很多你可能想要记录的特性 和/或审计。新的详细脚本跟踪功能可让您启用 对 Windows PowerShell 脚本使用的详细跟踪和分析 一个系统。启用详细脚本跟踪后,Windows PowerShell 将所有脚本块记录到 ETW 事件日志, Microsoft-Windows-PowerShell/操作。如果脚本块创建 另一个脚本块(例如,调用 字符串上的 Invoke-Expression cmdlet),生成的脚本块是 也登录了。

    可以通过打开 PowerShell 启用这些事件的日志记录 脚本块日志记录组策略设置(在管理模板中 -> Windows 组件 -> Windows PowerShell)。

    https://docs.microsoft.com/en-us/powershell/wmf/5.0/audit_script

    【讨论】:

    • 感谢您的快速响应,但我看不出这些选项如何强制所有 cmdlet 使用详细输出?我审查了所有三个,并尝试了增强脚本日志记录,但仍然必须手动将-Verbose 添加到我的Copy-Item 命令的末尾以记录项目列表。
    • 不用担心,但是您可以在全局级别设置详细程度。查看为您添加的更新。
    • 完美! $PSDefaultParameterValues['*:Verbose'] = $true 完全按照我的需要工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多