我想知道是否有方法来运行PowerShell脚本,以便打印脚本的每一行命令和输出。例如,在Bash中,您可以编写bash -x myscript
或在脚本的顶部放置一个set -x
。在批处理中,您会忽略传统上留在脚本顶部的@echo off
。 PowerShell是否具有这些结构的等价物?如何运行带有详细输出的PowerShell脚本?
事情我已经尝试:运行powershell -? | sls verbose
,这却一无所获。
我想知道是否有方法来运行PowerShell脚本,以便打印脚本的每一行命令和输出。例如,在Bash中,您可以编写bash -x myscript
或在脚本的顶部放置一个set -x
。在批处理中,您会忽略传统上留在脚本顶部的@echo off
。 PowerShell是否具有这些结构的等价物?如何运行带有详细输出的PowerShell脚本?
事情我已经尝试:运行powershell -? | sls verbose
,这却一无所获。
只是去展示,@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
的单行。
如果您使用写详细的脚本,这将自动发生,
但是,如果你需要手动编写从功能的详细输出,您需要手动检查每个函数被调用与详细的旗帜。这可以通过从函数内部检查$ PSCmdlet.MyInvocation.BoundParameters [“详细”] 来完成。
这实际上是非常简单的,每个PowerShell CMDLET都有一个内置的Verbose标签。所有你必须例如做:
测试,连接-ComputerName www.google.com -Verbose
这就是它。我希望这可以帮助
首先,有问题的用户应该在询问之前做一些调查? [google:Echo on PowerShell](http://www.google.com/search?q=Echo+on+for+powershell&oq=Echo+on+for+powershell) – LotPings
@LotPings对不起,它没有发生在我身上谷歌“回声的PowerShell”。 –