如何使用详细输出运行PowerShell脚本?

时间:2016-12-25 22:13:08

标签: windows shell powershell windows-10

我想知道是否有办法运行PowerShell脚本,以便打印脚本每行的命令和输出。例如,在Bash中,您可以编写bash -x myscript或在脚本顶部放置set -x。在批处理中,您将省略传统上留在脚本顶部的@echo off。 PowerShell是否具有这些结构的等价物?

我尝试过的事情:正在运行powershell -? | sls verbose,但没有任何结果。

4 个答案:

答案 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)

您可以随时在脚本中使用以下内容。

  

$ VerbosePreference = “继续”

注意:您必须以提升模式打开shell。

下面的屏幕截图仅供参考。

$VerbosePreference

希望它有所帮助。

答案 2 :(得分:2)

这实际上非常简单,每个PowerShell CMDLET都有一个内置的详细标记。所有你需要做的事情:

Test-Connection -ComputerName www.google.com -Verbose

就是这样。我希望这有帮助

答案 3 :(得分:0)

如果你在脚本中使用write-verbose,这将自动发生,

但是,如果需要手动编写函数的详细输出,则需要手动检查是否使用详细标记调用了每个函数。这可以通过检查$ PSCmdlet.MyInvocation.BoundParameters [&#34; Verbose&#34;]来完成。 来自你的功能。