2013-07-15 38 views
2

我正在写一个简单的脚本,以便在包含单词“插件”的文件夹“全屏”内递归列出所有文件。 因为路径太长而且没有必要,所以我决定让文件名变为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 } 

我收到此错误:

Cannot bind argument to parameter 'Path' because it is null.

回答

8

您近::-)

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

这还努力:

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

BTW我一般会避免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 

更新:得到公正的CONTA进不去文件夹名称,这样做:

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

谢谢你的帮助,但我想你没有理解什么我想实现。我编辑了我的问题,提供了更多关于我在寻找什么样的输出的细节。欢呼声 – RafaelGP

+0

@RafaelGP查看最新的答案。 –

+0

天才!谢谢!这很棘手。我永远不会得到这个一个人! – RafaelGP

1

FileInfo类的Directory属性告诉你的父目录,你只需要抓住的是,基座上,用你的文件的名称加入。注意额外的foreach它可以将物品放回FileInfo对象:

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)} 
+0

'Select-String'输出'MatchInfo'对象,而不是'FileInfo'对象,所以没有'Directory'属性可用。 –

+0

@凯思谢谢,我忘记了。我编辑了我的答案,提供了一个稍微不同的方法。 – zdan

+0

让我们再试一次...在PowerShell V4中,您将能够通过'-PipelineVariable'参数(别名pv)使用FileInfo,例如dir。\ fullscreen -pv fi | sls插件| foreach {write-output(join-path $ fi.Directory.BaseName $ _。Filename)} –

相关问题