拆分和追加路径

时间:2016-02-01 15:14:20

标签: arrays powershell split

我有一个场景,我有一个包含路径数组的变量($patharray)。例如:

/Partners/ftpuser1/Reports/ 
/Partners/ftpuser2/Jan2016/29.01.2016/    
/Partners/ftpuser2/Jan2016/30.01.2016/ 
/Partners/Ftpuser3/January 2016/29.1.16/ 
/Partners/ftpuser4/January 16/ 
/Partners/ftpuser5/TS 2016/January/2901/ 
/Partners/ftpuser5/TS 2016/January/3001/

由此我需要通过将每个路径分解为第一个文件夹,然后将第一个文件夹/第二个文件夹分割来创建一个新数组,依此类推。所以对于上面它需要是:

/Partners
/Partners/ftpuser1
/Partners/ftpuser1/Reports
/Partners
/Partners/ftpuser2
/Partners/ftpuser2/Jan2016
/Partners/ftpuser2/Jan2016/30.01.2016
/Partners
/Partners/ftpuser3
/Partners/ftpuser3/January 2016
...

虽然我可以通过以下方式愉快地拆分数组:

$newpatharray = $patharray -split "/"

我不确定如何以这种方式迭代以组合$patharray中每个对象的各种字符串以获得我需要的输出格式。它还需要考虑任何路径深度。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

拆分每条路径,然后重新组合其元素。尝试这样的事情:

$patharray | ForEach-Object {
  $a = $_.TrimEnd('/') -split '/'
  for ($i=1; $i -lt $a.Count; $i++) {
    $a[0..$i] -join '/'
  }
}

答案 1 :(得分:1)

对一个字符串起作用的简单方法是这样的:

$path = "/Partners/ftpuser1/Reports/" 

# The where-object will drop the leading and trailing entries from the splits. 
$split = $path -split "/" | Where-Object{![string]::IsNullOrWhiteSpace($_)}
for($splitIndex = 0; $splitIndex -lt $split.Count; $splitIndex++){
    # Need to add back leading slash

    "/" + ($split[0..$splitIndex] -join "/")
}

可以轻松地将其包装在ForEach-Object中以处理许多路径。

涉及Split-Path的循环对此可能更可靠(我的手被拍了一次路径上的字符串操作)。您必须更改输出的斜杠,因为Split-Path会反转它们。

function Split-PathRecursive($path){
    # Split the path to get the parent
    $parent = Split-Path $path -Parent

    if($parent -ne "\"){
        # The parent is not the root path. Continue to process.
        $parent
        Split-PathRecursive $parent
    }
}

$pathArray = .....

$pathArray | ForEach-Object{
    # Get all the parent paths. Also need to change the slashes and how it is sorted.
    (Split-PathRecursive $_) -replace "\\","/" | Sort-Object
    # Display the full path as well
    $_
}