返回列表 发帖

[问题求助] [已解决]PowerShell如何获取所有路径行中的公共部分?

本帖最后由 5i365 于 2023-1-25 19:07 编辑

有没有一种简单的方法可以获取一个多行字符串中, 所有路径的公共部分?
在下面的示例中,我希望输出为
C:\Users\Administrator\Desktop\Test0\DEF\
C:\Users\Administrator\Desktop\Test0\DEF\A
C:\Users\Administrator\Desktop\Test0\DEF\B
C:\Users\Administrator\Desktop\Test0\DEF\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\2.txt
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

$s=$s -split "\r?\n"
for($i=0;$i -lt $s.length;$i++){
    if(!(gv a 2>$null)){
for($j=0;$j -lt $s[$i+1].length;$j++){
    if(($s[$i][0..$j] -join '') -ne ($s[$i+1][0..$j] -join '')){$a=$s[$i][0..($j-1)] -join '';break}
}
    }
    if($s[$i+1] -notmatch [regex]::Escape($a)){$a;rv a}
}COPY
1

评分人数

    • 5i365: 乐于助人技术 + 1

TOP

本帖最后由 5i365 于 2023-1-25 17:50 编辑

回复 5# idwma

下面的代码执行的结果是错误的
应该输出:
C:\Users\Administrator\hello
C:\Users\Administrator\Desktop\Test0\DEF\
感觉适应各种情况有点难


  
$s = @'
C:\Users\Administrator\hello
C:\Users\Administrator\hello\B
C:\Users\Administrator\hello\C\a.bat
C:\Users\Administrator\hello\B\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\A
C:\Users\Administrator\Desktop\Test0\DEF\B
C:\Users\Administrator\Desktop\Test0\DEF\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\2.txt
'@
$s = $s -split "\r?\n"
for ($i = 0; $i -lt $s.length; $i++)
{
        if (!(gv a 2>$null)) { $a = split-path $s[$i] }
        if ($s[$i + 1] -notmatch [regex]::Escape($a)) { $a + '\'; rv a }
}COPY
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 5# idwma


   多谢大侠帮忙, 结果是正确的, 但是水平有限, 代码实在看不懂
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

$s=$s -split "\r?\n"
for($i=0;$i -lt $s.length;$i++){
if(!(gv a 2>$null)){$a=split-path $s[$i]}
if($s[$i+1] -notmatch [regex]::Escape($a)){$a+'\';rv a}
}COPY

TOP

本帖最后由 5i365 于 2023-1-25 14:39 编辑

回复 2# idwma

下面这样写, 还是有个多余的项存在, 而且公共路径后应该有个\
$s = @'
C:\Users\Administrator\hello\A
C:\Users\Administrator\hello\B
C:\Users\Administrator\hello\B\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\A
C:\Users\Administrator\Desktop\Test0\DEF\B
C:\Users\Administrator\Desktop\Test0\DEF\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\2.txt
'@
$s -split "\r?\n" |
foreach {
        Split-Path $_
} | sort-object | Get-UniqueCOPY
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2023-1-25 14:39 编辑

回复 2# idwma

多谢大侠指引, 下面的代码, 实际上有两个公共的路径, 分别如下: 但是如何只输出这两行呢?
C:\Users\Administrator\hello\
C:\Users\Administrator\Desktop\Test0\DEF\
这个逻辑有点难以描述

$s = @'
C:\Users\Administrator\hello\A
C:\Users\Administrator\hello\B
C:\Users\Administrator\hello\B\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\A
C:\Users\Administrator\Desktop\Test0\DEF\B
C:\Users\Administrator\Desktop\Test0\DEF\1.txt
C:\Users\Administrator\Desktop\Test0\DEF\2.txt
'@
$s -split "\r?\n" |
foreach {
        Split-Path $_
}COPY
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

试试split-path

TOP

返回列表