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

Raf*_*lGP 2 powershell

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

on\index.xml
off\index.xml
Run Code Online (Sandbox Code Playgroud)

代替:

C:\this\is\a\very\long\path\fullscreen\on\index.xml
C:\this\is\a\very\long\path\fullscreen\off\index.xml
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

dir .\fullscreen | sls plugin | foreach { write-host $($_).path }
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

Kei*_*ill 8

你很亲密::-)

dir .\fullscreen | sls plugin | foreach { write-host $_.path }
Run Code Online (Sandbox Code Playgroud)

这也有效:

dir .\fullscreen | sls plugin | foreach { write-host "$($_.path)" }
Run Code Online (Sandbox Code Playgroud)

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

$files = dir .\fullscreen | sls plugin | foreach { write-host $_.path } # doesn't work
Run Code Online (Sandbox Code Playgroud)

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

dir .\fullscreen | sls plugin | foreach { $_.path }
Run Code Online (Sandbox Code Playgroud)

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

dir .\fullscreen | sls plugin | % Path
Run Code Online (Sandbox Code Playgroud)

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

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