我正在尝试编写迁移/部署脚本以将应用程序部署到环境(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
,它将会显示。)
有什么想法?我错了吗?请帮忙!
答案 0 :(得分:3)
如何利用......
提示:创建Windows PowerShell中的操作脚本
PowerShell控制台包含一个可用于帮助您的脚本功能 在提示符下记录您的所有活动。在撰写本文时,你 无法在PowerShell应用程序中使用此功能。命令你 与成绩单一起使用包括以下内容:
......或者提供/详述的方法:
增强的脚本记录模块(自动控制台输出捕获到 文件)
自动将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。
另见:
脚本跟踪和记录
虽然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