Функция Powershell, которая возвращает значение и производит отладочный вывод - PullRequest
2 голосов
/ 29 июля 2011

Я пишу функцию Powershell, которая используется внутри сценария .ps1, который я пишу.

Функция возвращает один номер, который используется функцией, которая вызывает его внутри скрипта.При разработке я хотел бы, чтобы функция выводила отладочную информацию (простые старые строки).

Иногда я просто хочу, чтобы выходные данные отладки отображались на экране, иногда я хотел бы захватить их в файл (который, как я полагаю, я буду делать с

.\myscript.pl1 > file.txt

или

.\myscript.pl1 2> file.txt

Есть ли способ сделать это?


Майк, я хочу попробовать write-log, но в моей системе у меня есть:

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 ]

1 голос
/ 29 июля 2011

Попробуйте и посмотрите, поможет ли это


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

Как и запись-отладка, запись в консоль. Если вы не хотите видеть эти сообщения, просто измените значение для DebugPreference в первой строке на SilentlyContinue.

Если вы не хотите, чтобы вывод шел в файл debug.out, просто закомментируйте эту строку или установите для нее значение $ outFile = $ null.

1 голос
/ 29 июля 2011

Если я вас понимаю в этот раз, вы можете сделать что-то вроде этого:

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

Поэтому, если вы не хотите выводить какие-либо данные, оставьте $debugpreference="SilentlyContinue"

Если вы хотите вывод, установите его на Continue

Единственное, что файл будет иметь дополнительный шум для расшифровки.

0 голосов
/ 29 июля 2011

В моих сценариях я использую функцию Write-Log, которая записывает свои входные данные с использованием out-файла и при необходимости записывает на экран запись-Host:

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

Этот подход не захватывает сообщения, записанные в stderr, такие как Start-Transcript, но вы можете контролировать то, что записывается в журнал.Я часто комбинирую обе техники при отладке.

0 голосов
/ 29 июля 2011

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...