我正在编写一个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
答案 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,但您可以控制写入日志的内容。我经常在调试时结合这两种技术。