powershell 无法将PS输出写入文件

nzkunb0c  于 2023-01-17  发布在  Shell
关注(0)|答案(4)|浏览(186)

我正在运行以下PS脚本,但似乎无法将输出写入文件

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

结果显示在屏幕上很好。我在这里错过了什么吗?谢谢!

eit6fx6z

eit6fx6z1#

我不相信foreach会沿着管道传递任何东西。你应该在foreach块中包含输出重定向,比如:

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

e4yzc0pl2#

尽管不明显,*您的行由 * 两个单独的语句 * 组成

  • foreach ($user in get-content file.txt) { dsget user $user -samid },它将打印到 * 控制台 *。
  • >> output_file.txt,该语句本身不是有效语句,会导致 * 语法错误 *。

假设使用简单的 * 表达式 * 进行输出重定向可以很好地工作--例如'hi' > out.txt--那么问题是为什么这不可能用于复合 * 语句 *,例如foreach循环和if语句。参见GitHub问题#10967。
正如其他几个人所指出的,您可以将>> output_file.txt移到脚本块内部--在这种情况下,输出重定向在 * 每个迭代 * 中执行--但是有 * 一个 * 单一 * 重定向的解决方案:

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

通过使用& { ... },您可以将foreach循环转换为一个(流) 命令 ,其输出可以重定向

您也可以使用$(...),但这样所有输出都将首先收集到 * 内存中 *。
但是,要真正获得逐个处理的流,您可以将 pipelineForEach-Objectcmdlet一起使用,如下所示-这通常会较慢,但更节省内存:

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

请注意ForEach-Object cmdlet(有点遗憾的是,它的别名也称为foreach)如何具有 implicit 循环变量:自动$_变量。
请注意,>>>实际上只是Out-File cmdlet的不同名称,它们默认情况下生成UTF-16 LE(“Unicode”)文件,这可能导致其他工具出现问题。要控制输出字符编码,请直接使用Out-File;例如,使用ASCII编码的示例:

Get-Content file.txt | foreach { dsget user $_ -samid } | Out-File -Encoding Ascii output_file.txt
des4xlb0

des4xlb03#

您需要将redirection operator放入scriptblock of the foreach loop中。

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

eqoofvh94#

foreach ($user in get-content file.txt) { dsget user $user -samid } | Out-File C:\output_file.txt

相关问题