Powershell函数返回值并生成调试输出

时间:2011-07-29 04:34:23

标签: debugging redirect powershell

我正在编写一个Powershell函数,该函数在我正在编写的.ps1脚本中使用。

该函数返回一个在脚本中调用它的函数使用的数字。在开发它时,我希望该函数输出调试信息(普通旧字符串)。

有时候我只是希望调试输出显示在屏幕上,有时候我想将它捕获到一个文件中(我假设我会用

.\myscript.pl1 > file.txt

.\myscript.pl1 2> file.txt

有没有办法做到这一点?


迈克,我想尝试写日志,但在我的系统上我有:

D:\library>gcm write*

CommandType     Name
-----------     ----
Alias           write
Application     write.exe
Application     write.exe
Cmdlet          Write-Debug
Cmdlet          Write-Error
Cmdlet          Write-EventLog
Cmdlet          Write-Host
Cmdlet          Write-Output
Cmdlet          Write-Progress
Cmdlet          Write-Verbose
Cmdlet          Write-Warning

4 个答案:

答案 0 :(得分:1)

如果我这次了解你,你可以这样做:

start-transcript -path debug.txt
write-debug "blah"
stop-transcript

因此,当您不想要任何类型的输出时,请离开$debugpreference="SilentlyContinue"

如果您想要输出,请将其设置为Continue

唯一的问题是该文件会对成绩单产生额外的噪音。

答案 1 :(得分:1)

尝试一下,看看是否有帮助


Set-Variable -Name DebugPreference -Value 'Continue'
$outFile = 'C:\tmp\debug.out'

function calledFunction {
    if ($outFile) { 
        "`nIn Called Function" | Out-File $outFile -Append 
        Write-Debug "In called function IF"
        return 1
    }   
    else { 
    Write-Debug "In called function ELSE"
    return 900 
    }
}

function callingFunction {
    $returnCount = calledFunction
    if ($outFile) { "`nReturn Count is $returnCount" | Out-File $outFile -Append }
    Write-Debug "Return Count is $returnCount"
    $outFile = $null
    if ((calledFunction) -gt 10) { Write-Debug "outFile is not set" }
}

callingFunction

因为它是write-debug将写入控制台。当您不想看到这些消息时,只需将第一行中的DebugPreference值更改为“SilentlyContinue”。

当您不希望输出到debug.out文件时,只需注释掉该行或将其设置为$ outFile = $ null。

答案 2 :(得分:0)

Tee-Object是你的朋友。

get-process | tee-object -filepath C:\Test1\testfile2.txt

以下是我在剧本中使用tee的方法:

Function display {
    Write-Output "Testing"
    return 20
}

Function CallAnother {
    Display
}    

CallAnother | Tee-Object "C:\DropBox\Scripts\Test.log"

而且,这是我的控制台和test.log的输出:

Testing
20

答案 3 :(得分:0)

在我的脚本中,我使用Write-Log功能,使用out-file写入输入,并可选择使用Write-Host写入屏幕:

Write-Log -Message $ MyMessage -Path $ MyLog -WriteHost

此方法不捕获写入stderr的消息,如Start-Transcript,但您可以控制写入日志的内容。我经常在调试时结合这两种技术。