我正在运行以下PS脚本,但似乎无法将输出写入文件
foreach ($user in get-content file.txt) { dsget user $user -samid } >> output_file.txt.
结果显示在屏幕上很好。我在这里错过了什么吗?谢谢!
eit6fx6z1#
我不相信foreach会沿着管道传递任何东西。你应该在foreach块中包含输出重定向,比如:
foreach ($user in get-content file.txt) {dsget user $user -samid >> output_file.txt}
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移到脚本块内部--在这种情况下,输出重定向在 * 每个迭代 * 中执行--但是有 * 一个 * 单一 * 重定向的解决方案:
'hi' > out.txt
foreach
if
& { foreach ($user in get-content file.txt) { dsget user $user -samid } } > output_file.txt
通过使用& { ... },您可以将foreach循环转换为一个(流) 命令 ,其输出可以重定向。
& { ... }
您也可以使用$(...),但这样所有输出都将首先收集到 * 内存中 *。但是,要真正获得逐个处理的流,您可以将 pipeline 与ForEach-Objectcmdlet一起使用,如下所示-这通常会较慢,但更节省内存:
$(...)
ForEach-Object
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编码的示例:
$_
>
>>
Out-File
Get-Content file.txt | foreach { dsget user $_ -samid } | Out-File -Encoding Ascii output_file.txt
des4xlb03#
您需要将redirection operator放入scriptblock of the foreach loop中。
foreach ($user in get-content file.txt) { dsget user $user -samid >> output_file.txt }
eqoofvh94#
foreach ($user in get-content file.txt) { dsget user $user -samid } | Out-File C:\output_file.txt
4条答案
按热度按时间eit6fx6z1#
我不相信foreach会沿着管道传递任何东西。你应该在foreach块中包含输出重定向,比如:
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
循环转换为一个(流) 命令 ,其输出可以重定向。您也可以使用
$(...)
,但这样所有输出都将首先收集到 * 内存中 *。但是,要真正获得逐个处理的流,您可以将 pipeline 与
ForEach-Object
cmdlet一起使用,如下所示-这通常会较慢,但更节省内存:请注意
ForEach-Object
cmdlet(有点遗憾的是,它的别名也称为foreach
)如何具有 implicit 循环变量:自动$_
变量。请注意,
>
和>>
实际上只是Out-File
cmdlet的不同名称,它们默认情况下生成UTF-16 LE(“Unicode”)文件,这可能导致其他工具出现问题。要控制输出字符编码,请直接使用Out-File
;例如,使用ASCII编码的示例:des4xlb03#
您需要将redirection operator放入scriptblock of the
foreach
loop中。eqoofvh94#