Powershell中具有长目录名的拆分路径

时间:2017-09-13 13:07:49

标签: powershell

当我在Win 10中的PC上使用Dropbox驱动器时,我有一个非常长的目录结构时,我对如何正确使用Powershell版本5的Split-Path感到困惑。

我的问题域是以递归方式运行我所做的软件更改的几个目录,有几个版本,有时每个目录都有两个或三个子目录,每个目录都在几个地方深处。

我的目录结构,它从C:\ Users \ XXXX \ Dropbox \ Doing \ SoftwareName \ Releases

开始

“发布”字段用于显示我希望能够汇总我的报告的版本号,该版本号位于.. \ Release目录下。位置是最后一个(子)目录,因此使用-Leaf和文件名作为文件。

  

我使用的代码(编辑:显示我学到的变化。由于引用了一个集合,我对输出中的Curly大括号感到满意。

 cd C:\Users\XXXX\Dropbox\Doing\SoftwareName\Releases

   Get-ChildItem -Path (Get-Location) -Filter *.cs -Recurse | 
ForEach-Object {
    $Release = $_.Directory.Split('\') -like "*Version*"
    $Location = Split-Path ($_.DirectoryName) -Leaf
    $File = $_.Name
        ForEach-Object {
            New-Object PSObject -Property @{
                Release = $Release.ToString()
                Location= $Location.ToString()
                File = $File.ToString()
                }
        } | Format-Table -AutoSize  Release, Location, File
}
  

输出(前三行简化)

 Release                                                              
   Location   File                                  
        C:\Users\XXXX\Dropbox\Doing\SoftwareName\Releases\Version1\StoryWriter StoryWriter Chapter1.cs
        C:\Users\XXXX\Dropbox\Doing\SoftwareName\Releases\Version2\StoryWriter\Outline\BeachScene BeachScene Chapter2.cs
        C:\Users\XXXX\Dropbox\Doing\SoftwareName\Releases\Version3\StoryWriter\Outline\Conversations Conversations Chapter3.cs
  

我想要的结果是

Release    Location File            
-------    -------- ----                                              
Version1 StoryWriter Chapter1.cs
Version2 BeachScene Chapter2.cs
Version3 Conversations Chapter3.cs

非常感谢。

2 个答案:

答案 0 :(得分:1)

你可以使用select-object的计算属性来实现这一点,但要继续你正在做的事情:

我摆脱了第一个foreach-object,因为它没有任何目的。此外,如果您要使用foreach-object,则需要将集合作为输入进行管道传输。

由于您希望在release列下显示版本文件夹名称,因此我使用正则表达式来解析路径。也许有更好的方法可以做到这一点,但无论如何都有用。只要版本文件夹在releases文件夹之前,这将有效。

Get-ChildItem -Path (Get-Location) -Filter *.cs -Recurse | 
ForEach-Object {

        New-Object PSObject -Property @{
                    Release = ([regex]::Matches($_.DirectoryName,'(?<=Releases\\)\w+\\' ) | select -ExpandProperty value) -replace '\\'
                    Location= Split-Path ($_.DirectoryName) -Leaf
                    File = $_.Name
                }


} | Format-Table -AutoSize  Release, Location, File

答案 1 :(得分:0)

试试这个:

Get-ChildItem -Path "c:\temp" -Filter *.cs -Recurse -file | where FullName -like '*\Release\version*\*\*' | %{
    $Array=$_.FullName -split '\\'
    $RankRealease=$Array.IndexOf("Release")
    [pscustomobject]@{Release = $Array[$RankRealease+1];Location= $Array[$RankRealease+2];File = $_.Name}
}