Board logo

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

作者: 5i365    时间: 2023-1-21 11:01     标题: [已解决]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

作者: idwma    时间: 2023-1-24 21:43

试试split-path
作者: 5i365    时间: 2023-1-25 13:37

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

回复 2# idwma

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

  1. $s = @'
  2. C:\Users\Administrator\hello\A
  3. C:\Users\Administrator\hello\B
  4. C:\Users\Administrator\hello\B\1.txt
  5. C:\Users\Administrator\Desktop\Test0\DEF\A
  6. C:\Users\Administrator\Desktop\Test0\DEF\B
  7. C:\Users\Administrator\Desktop\Test0\DEF\1.txt
  8. C:\Users\Administrator\Desktop\Test0\DEF\2.txt
  9. '@
  10. $s -split "\r?\n" |
  11. foreach {
  12.         Split-Path $_
  13. }
复制代码

作者: 5i365    时间: 2023-1-25 14:34

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

回复 2# idwma

下面这样写, 还是有个多余的项存在, 而且公共路径后应该有个\
  1. $s = @'
  2. C:\Users\Administrator\hello\A
  3. C:\Users\Administrator\hello\B
  4. C:\Users\Administrator\hello\B\1.txt
  5. C:\Users\Administrator\Desktop\Test0\DEF\A
  6. C:\Users\Administrator\Desktop\Test0\DEF\B
  7. C:\Users\Administrator\Desktop\Test0\DEF\1.txt
  8. C:\Users\Administrator\Desktop\Test0\DEF\2.txt
  9. '@
  10. $s -split "\r?\n" |
  11. foreach {
  12.         Split-Path $_
  13. } | sort-object | Get-Unique
复制代码

作者: idwma    时间: 2023-1-25 16:07

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

作者: 5i365    时间: 2023-1-25 17:41

回复 5# idwma


   多谢大侠帮忙, 结果是正确的, 但是水平有限, 代码实在看不懂
作者: 5i365    时间: 2023-1-25 17:46

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

回复 5# idwma

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


  
  1. $s = @'
  2. C:\Users\Administrator\hello
  3. C:\Users\Administrator\hello\B
  4. C:\Users\Administrator\hello\C\a.bat
  5. C:\Users\Administrator\hello\B\1.txt
  6. C:\Users\Administrator\Desktop\Test0\DEF\A
  7. C:\Users\Administrator\Desktop\Test0\DEF\B
  8. C:\Users\Administrator\Desktop\Test0\DEF\1.txt
  9. C:\Users\Administrator\Desktop\Test0\DEF\2.txt
  10. '@
  11. $s = $s -split "\r?\n"
  12. for ($i = 0; $i -lt $s.length; $i++)
  13. {
  14.         if (!(gv a 2>$null)) { $a = split-path $s[$i] }
  15.         if ($s[$i + 1] -notmatch [regex]::Escape($a)) { $a + '\'; rv a }
  16. }
复制代码

作者: idwma    时间: 2023-1-25 18:26

  1. $s=$s -split "\r?\n"
  2. for($i=0;$i -lt $s.length;$i++){
  3.     if(!(gv a 2>$null)){
  4. for($j=0;$j -lt $s[$i+1].length;$j++){
  5.     if(($s[$i][0..$j] -join '') -ne ($s[$i+1][0..$j] -join '')){$a=$s[$i][0..($j-1)] -join '';break}
  6. }
  7.     }
  8.     if($s[$i+1] -notmatch [regex]::Escape($a)){$a;rv a}
  9. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2