我正在对一个大型文件目录进行排序,我正在尝试从ls命令的输出中选择单独的行并仅显示这些行,但是我得到了奇怪的结果,而且我对powershell不太熟悉,知道我是什么做错了。
这种方法有效:
ls > data.txt
select-string 2012 data.txt
rm data.txt
但是创建一个文件只是为了读取我已经填写到文件中的数据似乎很浪费。我想将输出直接传递给select-string。
我尝试过这种方法:
ls | select-string 2012
但这并没有给我合适的输出。
我的猜测是我需要将ls的输出转换为select-string可以使用的东西,但我不知道如何做到这一点,甚至不知道这是否真的是正确的方法
答案 0 :(得分:8)
PowerShell是面向对象的,而不是像cmd
这样的纯文本。如果要获取2012年修改过的文件对象(行),请使用:
Get-ChildItem | Where-Object { $_.LastWriteTime.Year -eq 2012 }
如果您想在文件名中获取带有“2012”的文件对象,请尝试:
Get-ChildItem *2012*
使用时
ls | select-string 2012
您实际上是在ls
/ get-childitem
列出的每个文件中搜索“2012”INSIDE的行。
如果您确实需要在select-string
的输出上使用get-childitem
,请尝试将其转换为字符串,然后将其拆分为行,然后进行搜索。像这样:
(Get-ChildItem | Out-String) -split "`n" | Select-String 2012
答案 1 :(得分:3)
我找到了另一种将对象转换为字符串的简单方法:
Get-ChildItem | Out-String -stream | Select-String 2012
如果您希望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命令非常聪明 他们,他们会渲染它们。如果你将原始对象传递给他们,他们就会 首先调用相应的格式化程序,然后渲染它们。)