如何从PowerShell脚本生成全面的日志文件

时间:2018-03-16 17:02:32

标签: powershell logging deployment

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

我试图在整个脚本中可靠地找到一种方法。换句话说,我不想依赖于在每个命令上包含-Verbose(因为当其他人将来维护脚本时可能会错过它)。我一直在查看$VerbosePreference之类的内容,以及使用-Verbose调用主cmdlet /函数的可能性,希望它们可以应用于整个脚本。但事实并非如此。虽然我使用的任何Write-Verbose命令都遵循这两种方法,但如果我专门将Copy-Item传递给它,则对-Verbose的调用仅显示详细列表。我真的希望我能错过一些东西!当然,我可以做我想要的事情!

示例代码:

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,它将会显示。)

有什么想法?我错了吗?请帮忙!

1 个答案:

答案 0 :(得分:3)

如何利用......

  

提示:创建Windows PowerShell中的操作脚本

     

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

     

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

......或者提供/详述的方法:

  

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

     

自动将PowerShell控制台输出复制到日志文件(来自   输出,错误,警告,详细和调试流),但仍然   在控制台显示输出。日志文件输出是前置的   与日期/时间和指示哪个流源于该行

     

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

     

写日志PowerShell日志记录功能

     

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

     

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事件日志中,   微软Windows的PowerShell中/运营。如果脚本块创建   另一个脚本块(例如,调用该脚本的脚本)   字符串上的Invoke-Expression cmdlet),生成的脚本块是   也记录了。

     

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

     

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