我想知道是否有办法运行PowerShell脚本,以便打印脚本每行的命令和输出。例如,在Bash中,您可以编写bash -x myscript
或在脚本顶部放置set -x
。在批处理中,您将省略传统上留在脚本顶部的@echo off
。 PowerShell是否具有这些结构的等价物?
我尝试过的事情:正在运行powershell -? | sls verbose
,但没有任何结果。
答案 0 :(得分:22)
只是去表示@JamesKo,如果你提出错误的问题,你会得到错误的答案:-(。有几个人基于(a)缺乏Linux曝光和(b)你的使用提出了善意的答案术语 verbose 。在下文中,我将向您介绍Linux如何在这个主题上与PowerShell相关,但如果您赶时间,可以随时跳到答案。:-)
<强>背景强>
在PowerShell中,verbose具有非常特定的含义,PowerShell man page甚至含糊不清:
显示有关操作的详细信息 命令。此信息类似于跟踪或中的信息 交易日志。此参数仅在命令生成时有效 一个详细的消息。
它甚至听起来像你想要的......但是让我们将它与set -x
的Linux文档进行比较,根据你的Linux风格,这可能是这个(来自man-pages project)...
shell应该为每个命令写入标准错误跟踪 它会扩展命令并在执行命令之前。
或者这(来自gnu)...
打印一系列简单命令,用于命令,案例命令,选择 命令,命令及其参数的算术或 关联的单词列表在扩展之后和它们之前 执行。
你问题的第一行清楚而简明地同意这些。但PowerShell中的冗长是不同的。简而言之,打开详细模式(使用-Verbose
命令行开关或$VerbosePreference
变量)只需启用从详细信息流到控制台的输出。 (就像Linux提供两个流,stdout和stderr一样,PowerShell提供了多个流:输出流,错误流,警告流,详细流和调试流。您可以使用与Linux相同的方式处理这些流 - 您可以例如,甚至可以使用commands 4>&1
将详细流合并到stdout。(您可以在PowerShell One-Liners: Accessing, Handling and Writing Data的Basic Writing Streams部分中阅读有关PowerShell的多个输出流的更多信息,并且快速参考是Complete Guide to PowerShell Punctuation。)
答案
Set-PSDebug命令将为您提供bash等效跟踪。您甚至可以使用-Trace
参数调整跟踪详细信息。首先,在使用Set-PSDebug
:
PS> Get-PSDepth
0
值 1 ,您可以在执行时获得每行代码,例如:
PS> Set-PSDebug -Trace 1
PS> Get-PSDepth
DEBUG: 1+ >>>> Get-PSDepth
DEBUG: 141+ >>>> {
DEBUG: 142+ >>>> $nest = -1
DEBUG: 143+ >>>> $thisId = $pid
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 145+ >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG: 146+ >>>> $nest++
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 148+ >>>> $nest
0
DEBUG: 149+ >>>> }
值 2 ,您还可以获得变量赋值和代码路径:
PS> Set-PSDebug -Trace 2
PS> Get-PSDepth
DEBUG: 1+ >>>> Get-PSDepth
DEBUG: ! CALL function '<ScriptBlock>'
DEBUG: 141+ >>>> {
DEBUG: ! CALL function 'Get-PSDepth' (defined in file 'C:\Users\msorens\Documents\WindowsPowerShell\profile.ps1')
DEBUG: 142+ >>>> $nest = -1
DEBUG: ! SET $nest = '-1'.
DEBUG: 143+ >>>> $thisId = $pid
DEBUG: ! SET $thisId = '9872'.
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 145+ >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG: ! SET $thisId = '10548'.
DEBUG: 146+ >>>> $nest++
DEBUG: ! SET $nest = '0'.
DEBUG: 144+ while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG: 148+ >>>> $nest
0
DEBUG: 149+ >>>> }
这些是我写的一个名为Get-PSDepth
的简单cmdlet的痕迹。它使用DEBUG
前缀打印命令,分配等,并与实际输出混合,在这种情况下,实际输出是仅包含0
的单行。
答案 1 :(得分:13)
答案 2 :(得分:2)
这实际上非常简单,每个PowerShell CMDLET都有一个内置的详细标记。所有你需要做的事情:
Test-Connection -ComputerName www.google.com -Verbose
就是这样。我希望这有帮助
答案 3 :(得分:0)
如果你在脚本中使用write-verbose,这将自动发生,
但是,如果需要手动编写函数的详细输出,则需要手动检查是否使用详细标记调用了每个函数。这可以通过检查$ PSCmdlet.MyInvocation.BoundParameters [&#34; Verbose&#34;]来完成。 来自你的功能。