我有一个场景,我有一个包含路径数组的变量($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
中每个对象的各种字符串以获得我需要的输出格式。它还需要考虑任何路径深度。
有人可以帮忙吗?
答案 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
$_
}