невозможно получить вывод foreach в файл в powershell - PullRequest
1 голос
/ 16 октября 2019

Я новичок в powershell, и я пытаюсь получить выходные данные цикла foreach в файл

цикл foreach выглядит следующим образом:

foreach ($element in $ashost)  {get_alerts($element)}

я получаю список предупрежденийв стандартный вывод

, поэтому я попытался записать вывод цикла for в файл следующим образом:

$output =
foreach ($element in $ashost)  {get_alerts($element)}|
$output | Out-File "C:\File.txt"

, но файл создан пустым

примечание: «get_alerts» - это функция для захвата каждого предупреждения, для которого я не указал конкретное возвращаемое значение, оно просто печатается на экране из Write-Host внутри функции

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вы утверждаете, что ваша функция get_alerts использует Write-Host для печати на экран .

Write-Host. Выходные данные в соответствии с дизайном не отправляются в PowerShell. поток вывода успеха [1] , поэтому ничего не записывается в $output, поэтому ничего не отправляется на Out-File, поэтому выв итоге получится пустой файл.

  • Если вы можете изменить функцию get_alerts, заменить Write-Host вызовы Write-Output вызовами или просто использовать неявный выход (например, вместо Write-Host $foo, используйте Write-Output $foo или просто $foo).

  • Если вы не можете , и если вы используете PowerShell v5 или выше, вы можете использовать перенаправление 6>&1, чтобы перенаправить Write-Host вывод в поток успешного вывода , что позволяет захватывать его:

& { foreach ($elem in $ashost) { get_alerts $elem } } 6>&1 | Out-File C:\File.txt

Или, используя один конвейер:

$ashost | ForEach-Object { get_alerts $_ } 6>&1 | Out-File C:\File.txt

См. этот ответ для получения дополнительной информации.


[1] Write-Host, как правило, не подходит для использования , если только яntent - записывать только на дисплей , минуя поток вывода успешных результатов и, таким образом, возможность отправлять вывод другим командам, захватывать его в переменную, перенаправлять в файл. В PSv5 + Write-Host записывает в поток информации , выход которого может быть перехвачен , но только через 6>. Смотрите также: последний раздел https://stackoverflow.com/a/50416448/45375

0 голосов
/ 16 октября 2019

если вы вернете $element ваша переменная $output должна содержать запрошенные данные:

$output = foreach ($element in $ashost)  {get_alerts($element);$element;}|
$output | Out-File "C:\File.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...