перенаправление вывода тестового пути в текстовый файл - PullRequest
2 голосов
/ 04 марта 2020

TXT-файл - это просто набор путей UN C, я пытаюсь получить список путей UN C из этого текстового файла, помещенный в другой текстовый файл после проверки тестового пути. на экране отображаются проверенные пути, но текстовый файл не заполняется.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-host "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Write-Host только запись в консоль. Я верю, что вы хотите, чтобы это было Write-Output.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-output "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}

Кроме того, вы можете просто пропустить Write-Output, и это тоже работает.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}
1 голос
/ 04 марта 2020

В дополнение Полезный ответ Стивена Замборского с справочной информацией :

  • 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.

...