我有一系列目录如下:
C:\Parent\Child\Child\_Grandchild
有些孩子比其他孩子更深。我需要修剪
C:\Parent\
和
\_Grandchild
进入由
组成的数组Child, Child
但我不断让PS脱离主角。它似乎主要是1,A,C,和P,但可能是其他人(那些是列表顶部的那些,所以我注意到它们) 。这是我正在使用的代码,我确定我使用拆分不正确,但无法弄清楚如何让它按需运行。
$a # <-- An array item in a foreach loop
$b = $a.TrimStart('C:\Parent\');
$c = $b.TrimEnd('\_Grandchild');
$c_split = $c -split '\\';
此代码似乎经常产生如下结果
$c_split[0] = 'hild'; # (or 'ild' in some cases, depending on the starting characters)
$c_split[1] = 'Child';
$c_split[2] = 'Child';
等等。我认为这是我最初的TrimStart,但在此过程中查看$ b看起来很好,就像你期望的那样。我试过在第一个修剪上留下尾随\但这似乎也没有解决问题。
答案 0 :(得分:2)
如果没有一些更好的测试数据,很难确定你的目标是什么,但我可能会有一些东西。如果您只想删除目录链中的C:\Parent
和\_GrandChild
或至少最后一个子项,则以下内容将起作用:
# Assumed test data
$Directories = @(
"C:\Parent\Child\Child\_Grandchild",
"C:\Parent\Child\Hulk\_Grandchild",
"C:\Parent\Child\DareDevil\Child\Child\_Grandchild",
"C:\Parent\Child\DoctorWho\Child\_Grandchild",
"C:\Parent\Child\DareDevil\Child\FrenchBread\_Grandchild"
)
$Directories | ForEach-Object {
$Path = $_
$Path = Split-Path -Path $Path -NoQualifier #Remove the C:
$Path = Split-Path -Path $Path # Remove the last portion
# Here you have "\Parent\..." excluding the _Grandchild portion
# Split it and then assign the first value to null to disguard
$Null, $Path = $Path.Split("\")
# Path is your array of items you want
}
答案 1 :(得分:0)
这可能是一个班轮。也许有点乱,但可以使用您的示例数据。 使用IO.Path,您可以删除驱动器根目录,使用正则表达式替换第一个反斜杠的所有内容,再次使用io.path删除最后一个文件夹,修改删除最后一个\并拆分。
$c_split = ($a.Replace([io.path]::GetPathRoot($a),"") -replace "^[^\\]*\\","").Replace([io.path]::GetFileName($a),"").TrimEnd("\").Split("\")
答案 2 :(得分:0)
这样的事情可能是:
$path = "C:\Parent\Child\Child\_Grandchild"
$split_path = $path.split("\")
$modified_path = $split_path[2..($split_path.length-2)]
假设你总是想要删除&#34; c:\ whatever&#34;从开始和最终目录。