Даже если это не очевидно, ваша строка состоит из двух отдельных операторов :
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