当我在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
非常感谢。
答案 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}
}