从Select-String输出中获取“父文件夹+文件名”

时间:2013-07-15 15:31:36

标签: powershell

我正在编写一个简单的脚本,在包含“插件”一词的“全屏”文件夹中递归列出所有文件。 因为路径太长而且不必要,所以我决定将文件名称放在jut上。 问题是所有文件都被称为“index.xml”,因此获取:“包含文件夹+文件名”非常有用。所以输出看起来像这样:

on\index.xml
off\index.xml

而不是:

C:\this\is\a\very\long\path\fullscreen\on\index.xml
C:\this\is\a\very\long\path\fullscreen\off\index.xml

这就是我所拥有的:

dir .\fullscreen | sls plugin | foreach { write-host $($_).path }

我收到此错误:

  

无法将参数绑定到参数'Path',因为它为null。

2 个答案:

答案 0 :(得分:8)

你很亲密:: - )

dir .\fullscreen | sls plugin | foreach { write-host $_.path }

这也有用:

dir .\fullscreen | sls plugin | foreach { write-host "$($_.path)" }

顺便说一下,我通常会避免使用Write-Host,除非你真的只是为某人显示信息才能看到谁坐在控制台上。如果您以后想要将此输出捕获到变量,则它将无法正常工作:

$files = dir .\fullscreen | sls plugin | foreach { write-host $_.path } # doesn't work

大多数情况下,您只需使用标准输出流即可实现相同的输出并启用对变量的捕获,例如:

dir .\fullscreen | sls plugin | foreach { $_.path }

如果您使用的是PowerShell v3,则可以简化为:

dir .\fullscreen | sls plugin | % Path

更新以获取包含文件夹的名称,请执行以下操作:

dir .\fullscreen | sls plugin | % {"$(split-path (split-path $_ -parent) -leaf)\$($_.Filename)"}

答案 1 :(得分:1)

Directory类的FileInfo属性告诉您父目录,您只需抓取它的基础并加入您的文件名。请注意将项目重新转换为FileInfo对象的额外foreach:

dir .\fullscreen | sls plugin | foreach{ get-item $_.Path } | foreach { write-output (join-path $_.Directory.BaseName $_.Name)}

如果你想避免额外的管道:

dir .\fullscreen | sls plugin | foreach{ $file = get-item $_.Path; write-output (join-path $file.Directory.BaseName $file.Name)}