将PowerShell psdebug跟踪的日志输出记录到文件

时间:2016-03-30 20:53:51

标签: powershell debugging trace

  1. 我有一个脚本" B" ,我想从中捕获调试 Set-PSDebug -Trace n 输出到文件。文件是 这里是关键字。)
  2. 我需要启动脚本的执行和调试捕获" B "来自另一个剧本,名为 A
  3. 示例:

    脚本 B

    Set-PSDebug -Trace 1
    
    Function FuncA {
        Write-Host "ABC"
        FuncB
    }
    
    Function FuncB {
        Write-Host "123"
    }
    
    FuncA
    FuncB
    

    正确调试输出是:

    DEBUG:   15+  >>>> FuncA
    DEBUG:    6+ Function FuncA  >>>> {
    DEBUG:    7+      >>>> Write-Host "ABC"
    ABC
    DEBUG:    8+      >>>> FuncB
    DEBUG:   11+ Function FuncB  >>>> {
    DEBUG:   12+      >>>> Write-Host "123"
    123
    DEBUG:   13+  >>>> }
    DEBUG:    9+  >>>> }
    DEBUG:   16+  >>>> FuncB
    DEBUG:   11+ Function FuncB  >>>> {
    DEBUG:   12+      >>>> Write-Host "123"
    123
    DEBUG:   13+  >>>> }
    

    但是当我尝试从脚本 A 通过start-process运行它以将输出捕获到文件时:

    $SParguments = "-NoProfile -file `"$stdTracefile`""
    Start-Process 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -ArgumentList $SParguments -RedirectStandardOutput $stdTracelog
    

    输出很奇怪:

    DEBUG:   15+  >>>> FuncA
    DEBUG:    6+ Function FuncA  >>>> {
    DEBUG:    7+      >>>> Write-Host "ABC"
    ABC
    123
    123
    

    调试消息在第一个函数之后停止,尽管脚本正确完成。

    任何想法为什么以及如何规避或避免这种想法?

    或者,我正在寻找另一种解决方案来达到顶部所述的两个目标。

    顺便说一句:我也尝试使用trace-command,其filepath参数,但我不知道如何跟踪整个脚本,而且我不知道如何获得Set-PSDebug提供的信息:正在执行的行和正在执行的命令没有其余的 我想自动处理调试输出,Set-PSDebug的输出正是我需要的。

2 个答案:

答案 0 :(得分:1)

所以,这是我在PowerShell v4.0中使用ISE和常规主机进行的一些测试所学到的。

  1. 使用 Write- cmdlet的任何似乎从遇到第一个cmdlet的点中断PSDebug输出。评论他们,例如在调用FuncB中的Write-Host "ABC"之前,Write-Host行将允许更多跟踪。

  2. 使用return修复了问题,虽然它确实意味着FuncB没有在FuncA中调用,只是由于脚本的逻辑流程。

  3. 将事物剥离回字符串本身似乎会导致预期的行为。我这意味着只需移除Write-Host cmdlet并离开"ABC""123"部分即可。我不喜欢从功能中吐出这样的文字,但至少它给出了我们在这个例子中期待的东西。见下文。

  4. 在脚本A的末尾留下一个空行改变了输出的行为,即如果第13行末尾有回车符,则输出格式如下所示。如果没有,那么你最终会在同一行上进行两行调试:

    DEBUG:13+>>>> FuncBDEBUG:8+功能FuncB>>>> {

  5. 在PowerShell 5.0中运行主要修复了(原始帖子)问题,尽管在Write-Host输出后立即运行的DEBUG行仍然存在问题(即没有换行)。再次,切换到下面解决方案中的代码修复了输出。

    ABCDEBUG:5+>>>> FuncB

  6. 解决方案

    脚本A C:\ Scripts \ PowerShell \ Test-Debug.ps1

    Set-PSDebug -Trace 1
    
    Function FuncA {
        "ABC"
        FuncB
    }
    
    Function FuncB {
        "123"
    }
    
    FuncA
    FuncB
    

    脚本B :: C:\ Scripts \ PowerShell \ Call-TestDebug.ps1

    $stdTraceFile = "C:\Scripts\PowerShell\Test-Debug.ps1"
    $stdTraceLog  = Join-Path $env:TEMP test.log
    
    $PSExecutable = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
    $SParguments = "-Version 4 -NoProfile -File $stdTracefile"
    
    Start-Process -FilePath $PSExecutable -ArgumentList $SParguments `
      -RedirectStandardOutput $stdTracelog
    

    这给出了我认为您在 test.log 中期待的输出:

    DEBUG:   12+  >>>> FuncA
    DEBUG:    3+ Function FuncA  >>>> {
    DEBUG:    4+      >>>> "ABC"
    ABC
    DEBUG:    5+      >>>> FuncB
    DEBUG:    8+ Function FuncB  >>>> {
    DEBUG:    9+      >>>> "123"
    123
    DEBUG:   10+  >>>> }
    DEBUG:    6+  >>>> }
    DEBUG:   13+  >>>> FuncB
    DEBUG:    8+ Function FuncB  >>>> {
    DEBUG:    9+      >>>> "123"
    123
    DEBUG:   10+  >>>> }
    

答案 1 :(得分:1)

解决方案:使用PowerShell 5!

我已经快速浏览了MS Connect,看看是否有任何暗示,这是一个已知/报告的错误,但没有找到任何东西。但是,PSv5中的行为更改这一事实表明存在修复,可能是引入了信息输出流。

如果您无法修改当前正在调用Write-Host等的脚本,那么从我们的集体测试中,我不确定除了使用PowerShell 5之外还有其他修复方法。如果你有一个庞大/受控的环境,显然不是一个微不足道的提议。