2016-12-25 114 views
5

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

事情我已经尝试:运行powershell -? | sls verbose,这却一无所获。

+0

首先,有问题的用户应该在询问之前做一些调查? [google:Echo on PowerShell](http://www.google.com/search?q=Echo+on+for+powershell&oq=Echo+on+for+powershell) – LotPings

+1

@LotPings对不起,它没有发生在我身上谷歌“回声的PowerShell”。 –

回答

12

只是去展示,@JamesKo,如果你问错误的问题,你会得到错误的答案:-(有几个人提出了诚意的答案,基于(a)缺乏Linux暴露和(b)您使用术语详细。下面我将引导您了解Linux与PowerShell在这个主题上的关系,但如果您急于开始,请随时跳到答案。:-)

背景

在PowerShell中,详细有着非常特定的含义,其中PowerShell man page甚至是相当模糊的约:

显示有关由 命令执行的操作的详细信息。此信息与事务日志中的跟踪信息或 中的信息相似。该参数仅在命令生成详细消息时才起作用 。

它甚至听起来像你想要的...但让我们比较,为Linux的文档set -x这取决于你的Linux的味道,可能是这(从man-pages project)...

外壳应 后标准错误写在每个命令痕迹它扩展命令并在执行之前。

或本(从gnu)...

打印简单的命令一丝为命令,命令的情况下,选择 命令和算术的命令及其参数或 相关单词列表在它们被扩大之后并且在它们被执行之前 。

您问题的第一行清晰简洁地与这些一致。但是PowerShell中的详细信息是不同的。简而言之,启用详细模式(无论是-Verbose命令行开关还是$VerbosePreference变量)只是将详细流的输出启用到控制台。 (就像Linux提供两种流stdout和stderr一样,PowerShell提供了多种流:输出流,错误流,警告流,详细流和调试流。您可以使用与Linux相同的流处理这些流 - 您可以即使使用,例如,commands 4>&1合并冗长的指向stdout的流,例如,(你可以阅读更多关于在PowerShell One-Liners: Accessing, Handling and Writing Data创作基本流部分和良好的快速参考PowerShell的多个输出流是Complete Guide to PowerShell Punctuation。)

答案

Set-PSDebug命令会给你bash等价的跟踪,你甚至可以用来调整跟踪细节参数。首先,这里的控制,采用Set-PSDebug前:

PS> Get-PSDepth 
0 

随着一个值,你得到的每行代码,因为它执行,如:

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+ >>>> } 

随着值你也可以得到变量赋值和代码路径:

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+ >>>> } 

那些是一个简单的le cmdlet我写的叫Get-PSDepth。它用前缀DEBUG打印命令,赋值等,并与实际输出混合在一起,在这种情况下,该输出是仅包含0的单行。

0

如果您使用写详细的脚本,这将自动发生,

但是,如果你需要手动编写从功能的详细输出,您需要手动检查每个函数被调用与详细的旗帜。这可以通过从函数内部检查$ PSCmdlet.MyInvocation.BoundParameters [“详细”] 来完成。

5

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

$ VerbosePreference = “继续”

注:你有提升模式打开外壳。

下面的截图仅供参考。

$VerbosePreference

希望它有帮助。

0

这实际上是非常简单的,每个PowerShell CMDLET都有一个内置的Verbose标签。所有你必须例如做:

测试,连接-ComputerName www.google.com -Verbose

这就是它。我希望这可以帮助