我正在编写一个简单的脚本,在包含“插件”一词的“全屏”文件夹中递归列出所有文件。 因为路径太长而且不必要,所以我决定将文件名称放在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。
答案 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)}