[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]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
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

  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. }
复制代码
1

评分人数

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

TOP

本帖最后由 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. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 5# idwma


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

TOP

  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. }
复制代码

TOP

本帖最后由 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
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 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. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

试试split-path

TOP

返回列表