Set-PSDebug -Trace n
输出到文件。(文件是
这里是关键字。)示例:
脚本 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的输出正是我需要的。
答案 0 :(得分:1)
所以,这是我在PowerShell v4.0中使用ISE和常规主机进行的一些测试所学到的。
使用 Write-
cmdlet的任何似乎从遇到第一个cmdlet的点中断PSDebug输出。评论他们,例如在调用FuncB中的Write-Host "ABC"
之前,Write-Host
行将允许更多跟踪。
使用return
修复了问题,虽然它确实意味着FuncB没有在FuncA中调用,只是由于脚本的逻辑流程。
将事物剥离回字符串本身似乎会导致预期的行为。我这意味着只需移除Write-Host
cmdlet并离开"ABC"
和"123"
部分即可。我不喜欢从功能中吐出这样的文字,但至少它给出了我们在这个例子中期待的东西。见下文。
在脚本A的末尾留下一个空行改变了输出的行为,即如果第13行末尾有回车符,则输出格式如下所示。如果没有,那么你最终会在同一行上进行两行调试:
DEBUG:13+>>>> FuncBDEBUG:8+功能FuncB>>>> {
在PowerShell 5.0中运行主要修复了(原始帖子)问题,尽管在Write-Host输出后立即运行的DEBUG行仍然存在问题(即没有换行)。再次,切换到下面解决方案中的代码修复了输出。
ABCDEBUG:5+>>>> FuncB
脚本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之外还有其他修复方法。如果你有一个庞大/受控的环境,显然不是一个微不足道的提议。