在PowerShell中,将Get-ChildItem管道传递给Select-String

6

我正在对一个大型文件目录进行排序,尝试从ls命令的输出中选择单独的行并仅显示那些行,但我得到了奇怪的结果,而且我不够熟悉powershell以知道我的错误在哪里。

这种方法有效:

ls > data.txt
select-string 2012 data.txt
rm data.txt

但是在我看来,创建一个文件只为了读取我已经填入文件中的数据似乎很浪费。我想要直接将输出传输到select-string。

我尝试过这种方法:

ls | select-string 2012

但是这并没有给我适当的输出结果。

我的猜测是,我需要将ls的输出转换为select-string可以处理的内容,但我不知道如何做到这一点,甚至不确定这是否是正确的方法。

2个回答

10

PowerShell是面向对象的,不像cmd那样纯文本。如果您想获取2012年修改的文件对象(行),请使用:

Get-ChildItem | Where-Object { $_.LastWriteTime.Year -eq 2012 }

如果你想获取文件名中包含“2012”的文件对象,请尝试:

Get-ChildItem *2012*

当你使用时

ls | select-string 2012

你实际上是在搜索每个文件内部带有“2012”的行,这些文件由ls / get-childitem列出。

如果您确实需要对get-childitem的输出使用select-string,请尝试将其转换为字符串,然后拆分成行再进行搜索。像这样:

(Get-ChildItem | Out-String) -split "`n" | Select-String 2012

非常感谢,这基本上涵盖了我所需的一切。我一开始就怀疑PowerShell正在处理对象,但我无法弄清如何将其转换为文本。 - shieldfoss

4

我发现了另一种简单的将对象转换为字符串的方法:

Get-ChildItem | Out-String -stream | Select-String 2012

在这篇非常有趣的文章中:
http://blogs.msdn.com/b/powershell/archive/2006/04/25/how-does-select-string-work-with-pipelines-of-objects.aspx 如果您想让 Select-String 在 Monad 格式化输出上工作,您需要将其作为字符串获取。关于我们的输出要理解的事情是:当您的命令序列发出一系列字符串时,我们会在不处理的情况下发出它。如果相反,您的命令序列发出一系列对象流,则我们将这些对象重定向到命令 Out-Default。Out-Default 查看对象的类型和注册的格式化元数据,以查看该对象类型是否具有默认视图。视图定义了一个格式化程序和该命令的元数据。大多数对象被定向到 Format-Table 或 Format-List(尽管它们也可以定向到 Format-Wide 或 Format-Custom)。这些格式化程序不会发出字符串!您可以通过以下方式自行查看:“这些格式记录然后被定向到 OUT-xxx 命令,以呈现到特定输出设备的适当数据。默认情况下,它们转到 Out-Host,但您可以将其管道传输到 Out-File、Out-Printer 或 Out-String。(注意:这些 OUT-xxx 命令非常聪明,如果您将格式化对象传输到它们,它们会呈现它们。如果您将原始对象传输到它们,则它们首先调用相应的格式化程序,然后呈现它们。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接