@AceLightning
I fell in programming.

Как получить результат выполнения функции и перенаправить поток вывода verbose в pipeline одновременно?

Здравствуйте,
есть функция, которая пишет текст в лог файл и выводит в окно powershell:
function Write-Log {
    [cmdletbinding()]
    param(
        [Parameter (ValueFromPipeline=$True)]
        [string]$Text, 
        [string]$LogFilePath, 
        [switch]$Silent, 
        [ConsoleColor]$ForegroundColor
    )

    process {
        [string]$MessageWithDate = "$((Get-Date).ToString())  $Text"
        if (-not($Silent)) {
            if($ForegroundColor -eq $null) {
                Write-Host $Text
            } else {
                Write-Host $Text -ForegroundColor $ForegroundColor
            }
        }
        try {
            if(-not (Test-Path($($LogFilePath)))) {
                New-Item -Path $($LogFilePath) -ItemType "file" | Out-Null
            }
            $MessageWithDate | Out-File -filepath $($LogFilePath) -Append -NoClobber
        } catch {
            Write-Host "Error has occurred while writing log note to file $($LogFilePath): $($_ | Select-Object -Property *)" -foregroundcolor red
        }
    }
}


Есть функция, которая возвращает значение:
function B{
    [cmdletbinding()]
    param(
        $message
    )

    begin {
        Write-Verbose "[Function B] - Start"
        Write-Verbose "Initial parameters:"
        ($PSBoundParameters.GetEnumerator() | ForEach-Object { Write-Verbose "- $($_.Key) = '$($_.Value)'" })
    }

    process {
        return ("Hello, " + $message)
    }

    end {
        Write-Verbose "[Function B] - End"
    }
}


Суть вопроса такова: мне нужно передать поток verbose в функцию Write-Log через pipeline и получить результат функции в переменную одновременно. Такой код все пишет в лог файл, даже output поток, а переменная получается пустой
$a = B -message "World" -Verbose 4>&1 | Write-Log -LogFilePath "D:\test.log"


Подскажите, пожалуйста, как правильно организовать этот процесс?
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
@AceLightning Автор вопроса
I fell in programming.
Пока нашел вот такой вариант, который работает как надо:
. { $a = B -message "World" -Verbose } 4>&1 | Write-Log -LogFilePath "D:\test.log"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
если вы добавите return $MessageWithDate в function Write-Log process
то получите назад все вообще:
$a = (B -message "World" -Verbose 4>&1 | Write-Log -LogFilePath "c:\temp\test.log" ) ; $a
[Function B] - Start
Initial parameters:
- message = 'World'
- Verbose = 'True'
Hello, World
[Function B] - End
3/30/2019 12:37:35 PM  [Function B] - Start
3/30/2019 12:37:35 PM  Initial parameters:
3/30/2019 12:37:35 PM  - message = 'World'
3/30/2019 12:37:35 PM  - Verbose = 'True'
3/30/2019 12:37:35 PM  Hello, World
3/30/2019 12:37:35 PM  [Function B] - End
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы