我正在运行以下PS脚本,但我似乎无法将输出写入文件
foreach ($user in get-content file.txt) { dsget user $user -samid } >> output_file.txt.
结果出现在屏幕上就好了。这里有什么我想念的吗?谢谢!
答案 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