在PowerShell

时间:2017-07-26 22:46:35

标签: powershell

我有一系列目录如下:

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看起来很好,就像你期望的那样。我试过在第一个修剪上留下尾随\但这似乎也没有解决问题。

3 个答案:

答案 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;从开始和最终目录。