Записать в вывод между двумя конвейерами - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь записать в вывод (echo) в двух каналах, чтобы отслеживать, что я делаю, но у меня ошибка.

Get-ChildItem $path -Recurse |
    Where-Object { $_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate } |
    Write-Output "deleting file" -PassThru |
    Remove-Item

но у меня есть эта ошибка:

Write-Output: входной объект не может быть привязан ни к каким параметрам для команды, потому что команда не принимает конвейерный ввод, или ввод и его свойства не соответствуют ни одному из параметров, которые принимают конвейерный ввод.

Я также тестировал в функции Foreach-Object

Get-ChildItem $path -Recurse |
Where-Object { $_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate } |
Foreach-Object {
    echo "deleting $($_.Name)";
    Remove-Item($_);
} 

но здесь ничего не печатается в консоли (но скрипт завершил работу без ошибок и удалил нужные мне файлы)

Так, как я могу напечатать к выводу через два Труба?

Thx

1 Ответ

0 голосов
/ 19 ноября 2018

Write-Output отправляет вывод в конвейер.Он принимает ввод через конвейер или аргумент, но не оба, так что вы можете сделать это:

Write-Output "Test"

или это:

"Test" | Write-Output

но не это:

"Test" | Write-Output "Test"

Решение:

Get-ChildItem $path -Recurse | where {
    $_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate
} | foreach {
    # Write-Host writes to the console only
    Write-Host "Deleting $($_.Name)"
    Remove-Item $_
}

Помните, что Remove-Item ожидает строковый аргумент, поэтому все, что вы передадите, будетпреобразован в строку.Приведение объекта FileInfo к строке может не всегда возвращать полный путь (из-за его реализации ToString()) в зависимости от того, как он был создан!

В приведенном выше примере безопасноиспользуйте, но это, например, вызовет исключение (если ваш текущий рабочий каталог не $path):

(Get-Item $path).GetFiles() | foreach { Remove-Item $_ }

Так что всегда безопаснее использовать $_.FullName.

...