3

我正在编写一个简单的脚本来递归地列出包含单词“插件”的文件夹“全屏”中的所有文件。因为路径太长,而且没有必要,所以我决定获取文件名。问题是所有文件都称为“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 }

我收到此错误:

无法将参数绑定到参数“路径”,因为它为空。

4

2 回答 2

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)"}
于 2013-07-15T15:54:31.227 回答
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)}
于 2013-07-15T18:13:56.077 回答