В дополнение Полезный ответ Стивена Замборского с справочной информацией :
Write-Host
пишет на хост [1] (обычно это консольный терминал), который обходит PowerShell поток вывода успеха и, следовательно, ничего не посылает через конвейер .
- См. Нижнюю часть этого ответа , когда
Write-Host
подходит; короче говоря: обычно вы должны использовать только для только для отображения для вывода .
Write-Output
- соответствующий командлет для создания данных вывода , но редко требуется , поскольку вы можете положиться на удобную PowerShell неявную *1052* выходное поведение , как показано в ответе Стивена и объяснено в этот ответ .
Кроме того, ваша команда будет работать намного лучше если вы просто передаете %
(ForEach-Object
) команды в целом на одиночный Out-File
вызов вместо вызова Out-File -Append
для каждого входного пути .
Вместо использования %
с условным явным выводом, вы можете более элегантно реализовать свою команду с помощью Where-Object
cmdlet:
Get-Content .\cfgpath.txt |
Where-Object { Test-Path $_ } |
Out-File -FilePath c:\temp\1.txt
Также обратите внимание, что для сохранения строк в файл более эффективно использовать Set-Content
вместо
Out-File
, однако обратите внимание, что в Windows PowerShell кодировка выходных символов по умолчанию отличается (больше не проблема в PowerShell [Core] 6+, который по умолчанию постоянно использует UTF без спецификации) -8); см. этот ответ о том, когда выбирать, какой командлет.
В отличие от этого, Out-File
и >
(его эффективный псевдоним) используют систему форматирования PowerShell для записи для -display представления любых нестроковых входных объектов в выходной файл , аналогично тому, как вывод выводится на дисплей по умолчанию.
Другими словами: Чтобы сохранить объекты в файл в способ, который подходит для последующей программной c обработки , вам необходимо использовать структурированный формат файла , например, CSV (Export-Csv
) или JSON ( ConvertTo-Json
, в сочетании с Set-Content
).
[1] В PowerShell 5.0 и выше Write-Host
теперь записывает в новый поток информацию поток (номер 6
), который по умолчанию печатает на хост. См. about_Redirection
. Следовательно, перенаправление 6>
теперь технически позволяет вам отправлять Write-Host
вывод через конвейер (хотя это не очень хорошая идея) или захватывать / перенаправлять его; например,
Write-Host hi 6>&1 | % { "[$_]" }
. Обратите внимание, что тип объектов, выводимых этим перенаправлением, является System.Management.Automation.InformationRecord
.