6

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

这种方法有效:

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

但是对我来说创建一个文件只是为了读取我已经必须填写到文件中的数据似乎很浪费。我想将输出直接传送到选择字符串。

我试过这种方法:

ls | select-string 2012

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

我的猜测是我需要将 ls 的输出转换为 select-string 可以使用的东西,但我不知道该怎么做,甚至不知道这是否真的是正确的方法。

4

2 回答 2

10

PowerShell 是面向对象的,而不是像cmd. 如果要获取 2012 年修改的文件对象(行),请使用:

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

如果要获取文件名中带有“2012”的文件对象,请尝试:

Get-ChildItem *2012*

当你使用

ls | select-string 2012

您实际上是在ls/get-childitem列出的每个文件中搜索带有“2012”的行。

如果你真的需要select-string在输出上使用get-childitem,尝试将其转换为字符串,然后分成几行,然后搜索它。像这样:

(Get-ChildItem | Out-String) -split "`n" | Select-String 2012
于 2013-04-05T14:40:34.960 回答
3

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

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 查看对象的类型和注册的格式化元数据,以查看是否存在该对象类型的默认视图。视图定义了 FORMATTER 和该命令的元数据。大多数对象都被矢量化到 Format-Table 或 Format-List(尽管它们可以转到 Format-Wide 或 Format-Custom)。这些格式化程序不会发出字符串!您可以通过以下方式亲自查看:" 这些格式化记录然后被引导到 OUT-xxx 命令,以呈现为特定输出设备的适当数据。默认情况下,它们会转到 Out-Host,但您可以将其通过管道传输到 Out-File、Out-Printer 或 Out-String。(注意:这些 OUT-xxx 命令非常聪明,如果您将格式化对象传送给它们,它们会渲染它们。如果您将原始对象传送给它们,它们将首先调用适当的格式化程序然后渲染它们。)

于 2015-02-24T16:45:34.857 回答