Невозможно записать вывод PS в файл - PullRequest
0 голосов
/ 03 мая 2018

Я запускаю следующий сценарий PS, но не могу записать вывод в файл

foreach ($user in get-content file.txt) { dsget user $user -samid } >> output_file.txt. 

Результаты отображаются на экране просто отлично. Есть что-то, чего я здесь не хватает? Спасибо!

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

Даже если это не очевидно, ваша строка состоит из двух отдельных операторов :

  • foreach ($user in get-content file.txt) { dsget user $user -samid }, который печатает на консоли .

  • >> output_file.txt, который сам по себе не является допустимым оператором и вызывает синтаксическую ошибку .

Учитывая, что использование простого выражения с перенаправлением вывода работает нормально - например, 'hi' > out.txt - вопрос в том, почему это невозможно с выражениями управления потоком такие как foreach цикл и if оператор. Эта проблема GitHub ставит этот вопрос.

Как указали несколько других, вы можете перемещать >> output_file.txt внутри блока скрипта - в этом случае перенаправление вывода выполняется в каждой итерации - но там равно решение с одиночным перенаправлением :

& { foreach ($user in get-content file.txt) { dsget user $user -samid } } >> output_file.txt

Используя & { ... }, вы превращаете цикл foreach в (потоковую) команду , выход которой можно перенаправить .

Вы также можете использовать $(...), но тогда весь вывод будет собран в памяти сначала.


Однако, , чтобы по-настоящему получить потоковую обработку, одну за другой, вы можете использовать pipe с командлетом ForEach-Object следующим образом - это как правило, будет медленнее, но более эффективным для использования памяти:

Get-Content file.txt | ForEach-Object { dsget user $_ -samid } >> output_file.txt

Обратите внимание, что командлет ForEach-Object (псевдоним которого, к сожалению, также называется foreach) имеет неявную переменную цикла : автоматическая переменная $_.

Обратите внимание, что > и >> фактически являются просто разными именами для командлета Out-File, который создает файлы UTF-16LE ("Unicode") по умолчанию , что может вызвать проблемы для других инструментов. Для управления кодировкой выходных символов используйте Out-File напрямую ; например, используя пример кодирования ASCII:

Get-Content file.txt | foreach { dsget user $_ -samid } | Out-File -Encoding Ascii output_file.txt
0 голосов
/ 03 мая 2018

Вам нужно поместить оператор перенаправления в блок скриптов цикла foreach .

foreach ($user in get-content file.txt) { dsget user $user -samid  >> output_file.txt }
0 голосов
/ 03 мая 2018

Я не верю, что foreach что-то проходит по трубе. Вы должны включить перенаправление вывода в блок foreach, например:

foreach ($user in get-content file.txt) {dsget user $user -samid >> output_file.txt}
0 голосов
/ 03 мая 2018
foreach ($user in get-content file.txt) { dsget user $user -samid } | Out-File C:\output_file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...