无法将PS输出写入文件

时间:2018-05-03 13:17:59

标签: powershell

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

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

结果出现在屏幕上就好了。这里有什么我想念的吗?谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

即使不是很明显,你的专栏由两个单独的陈述构成

  • foreach ($user in get-content file.txt) { dsget user $user -samid },打印到控制台

  • >> output_file.txt,它本身不是一个有效的语句,会导致语法错误

鉴于使用带有输出重定向的简单表达式工作正常 - 例如'hi' > out.txt - 问题是为什么流控制表达式无法实现这一点,例如foreach循环和if语句。 This GitHub issue提出了这个问题。

正如其他几个人所指出的,您可以在脚本块中移动>> output_file.txt - 在这种情况下,输出重定向在每次迭代中执行 - 但是那里具有重定向的解决方案:

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

使用& { ... },您可以将foreach循环变为(流媒体)命令,其输出可以重定向

您也可以使用$(...),但所有输出将首先在内存中收集

但是,要真正获得流式传输,逐个处理,您可以将管道ForEach-Object cmdlet一起使用 如下 - 这通常会更慢,但内存效率更高:

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

请注意ForEach-Object cmdlet(其别名,有点不幸,也称为foreach)有一个隐式循环变量:自动$_变量。

请注意, >>> 实际上只是Out-File cmdlet的不同名称,生成UTF-16LE(“Unicode”)默认情况下的文件,这可能会导致其他工具出现问题。 要控制输出字符编码,请直接使用Out-File ;例如,使用ASCII编码的例子:

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

答案 2 :(得分:0)

您需要将redirection operator放在scriptblock of the foreach loop

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

答案 3 :(得分:-1)

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