我正在搜索所有行与'png'和'jpg'字符串在他们跨越多个文件夹的TXT文件。
尝试:
(Get-ChildItem K:\FILES -Recurse -Include '*.txt') | ForEach-Object {
(Get-Content $_) -match '\.png','\.jpg' | out-file K:\Output.txt
}
但是它没有输出任何东西。也没有错误。我最近做了类似的事情,它正在工作。我挠头想知道我在这里做错了什么...
我正在搜索所有行与'png'和'jpg'字符串在他们跨越多个文件夹的TXT文件。
尝试:
(Get-ChildItem K:\FILES -Recurse -Include '*.txt') | ForEach-Object {
(Get-Content $_) -match '\.png','\.jpg' | out-file K:\Output.txt
}
但是它没有输出任何东西。也没有错误。我最近做了类似的事情,它正在工作。我挠头想知道我在这里做错了什么...
1条答案
按热度按时间mftmpeh81#
通过将
Out-File
调用 * 放在ForEach-Object
脚本块 * 中,您将为每个输入文件 * 完全 * 重写输出文件,这样,* 最后一个 * 输入文件的结果--可能是 * none *-最终将成为文件的唯一内容。立即修复是将
Out-File
调用移动到它自己的管道段,以便它跨所有文件接收 * 所有 * 输出:Note:从技术上讲,将
-Append
添加到ForEach-Object
* 内部 * 的Out-File
调用中也可以工作,但是应该 * 避免 * 这种方法:Out-File
调用都必须打开和关闭输出文件,这使得操作要慢得多。但是,请考虑借助**
Select-String
*******加快命令的执行速度:注:
-Raw
开关与Select-String
一起使用,它只直接输出所有匹配行的 * text *,在这种情况下不需要ForEach-Object Line
。如果要在每个匹配行前加上源文件路径前缀:
Note:如果您将
Select-String
输出 * 直接 *(不使用-Raw
或ForEach-Object Line
)通过管道传输到Out-File
(或者如果您使用>
),您将得到 * 相似 * 的输出(甚至包括 * 字符位置 *),但有 * 限制 *:原因是
Out-File
及其虚拟别名>
将输入对象的 * for-display * 表示形式发送到输出文件,这并不意味着要进行 * 编程式 * 处理,而且可能会导致根据当前控制台窗口的行长度(列数)截断数据。