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

[问题求助] 如何使用PS生成Markdow或XML来表达CMD中tree命令所生成的结构

本帖最后由 5i365 于 2022-3-12 12:25 编辑

我想把桌面上名为 顶级 的文件夹内的结构用 Markdow 文本的形式表示出来,

请求高手指点,有没有更简单的PS命令或方法可以实现, 提前感谢!  

实际情况中,文件夹的深度可能达N级, 在ps中, dir 中有的 能控制深度级别的参数 -dep ,估计可能用得上, 用这个控制 Markdow文本中的#数量?

文件夹示例下载: https://send.cm/d/9HBz

CMD的Tree命令所显示的文件夹结构如下:

C:\Users\Administrator\Desktop>tree 顶级 /F
C:\USERS\ADMINISTRATOR\DESKTOP\顶级
├─一级1
│  ├─二级1
│  │  ├─三级1
│  │  │  ├─四级1
│  │  │  └─四级2
│  │  └─三级2
│  │      ├─四级1
│  │      └─四级2
│  └─二级2
│      ├─三级1
│      │  ├─四级1
│      │  └─四级2
│      └─三级2
│          ├─四级1
│          └─四级2
├─一级2
│  ├─二级1
│  │  ├─三级1
│  │  │  ├─四级1
│  │  │  └─四级2
│  │  └─三级2
│  │      ├─四级1
│  │      └─四级2
│  └─二级2
│      ├─三级1
│      │  ├─四级1
│      │  └─四级2
│      └─三级2
│          ├─四级1
│          └─四级2
└─一级3
    ├─二级1
    │  ├─三级1
    │  │  ├─四级1
    │  │  └─四级2
    │  └─三级2
    │      ├─四级1
    │      └─四级2
    └─二级2
        ├─三级1
        │  ├─四级1
        │  └─四级2
        └─三级2
            ├─四级1
            └─四级2
--------------------------------------------------------------------------------
期待PS脚本能生成的 Markdow  文本如下: 里面的空行是示意的, 可以不要

# 顶级 #

## 一级1 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

## 一级2 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

## 一级3 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

  1. "#顶级#"
  2. dir -dir 顶级 -r -name|sort|%{
  3. 1..$_.split("\").count+1|%{$mark="#"+$mark}
  4. $mark+$_.split("\")[-1]+$mark
  5. rv mark
  6. }
复制代码

TOP

回复 2# for_flr


    感谢大侠帮忙, 第一行中的-r改成-rec后, 可以成功生成,  但是#号和文字相接的地方有个空格, 应该改哪里?
例如
##一级1##
应为
## 一级1 ##

TOP

回复 3# 5i365


    第四行,$mark变量表示若干个#

TOP

回复 4# for_flr


    多谢指教, 已经成功输出:
  1. gci 顶级 -dir -rec -name | sort | foreach{
  2. 1 .. $_.split("\").count + 1 | foreach{ $mark = "#" + $mark }
  3. $mark + ' ' + $_.split("\")[-1] + ' ' + $mark
  4. rv mark
  5. } | tee -var s
复制代码

TOP

本帖最后由 5i365 于 2022-3-8 23:49 编辑

回复 4# for_flr


大侠好, 又遇到一个难题, 这回感觉要复杂多了, 还是接着最上面的描述, 到文件夹的最底层之后, 如果存在文件, 则把文件名提出来, 例如现在文件夹的总结构变为如下:
注这里的底层是指最底层,没有文件夹了!

C:\USERS\ADMINISTRATOR\DESKTOP\文件夹结果生成MD\顶级
├─一级1
│  ├─二级1
│  │  ├─三级1
│  │  │  ├─四级1
│  │  │  │      四级文件1.txt
│  │  │  │      四级文件2.txt
│  │  │  │
│  │  │  └─四级2
│  │  │          四级文件1.txt
│  │  │          四级文件2.txt
│  │  │          四级文件3.txt
│  │  │
│  │  └─三级2
│  │      ├─四级1
│  │      └─四级2
│  └─二级2
│      ├─三级1
│      │  ├─四级1
│      │  └─四级2
│      └─三级2
│          ├─四级1
│          └─四级2
├─一级2
│  ├─二级1
│  │  ├─三级1
│  │  │  ├─四级1
│  │  │  └─四级2
│  │  └─三级2
│  │      ├─四级1
│  │      └─四级2
│  └─二级2
│      ├─三级1
│      │  ├─四级1
│      │  └─四级2
│      └─三级2
│          ├─四级1
│          └─四级2
└─一级3
    ├─二级1
    │  ├─三级1
    │  │  ├─四级1
    │  │  └─四级2
    │  └─三级2
    │      ├─四级1
    │      └─四级2
    └─二级2
        ├─三级1
        │  ├─四级1
        │  └─四级2
        └─三级2
            ├─四级1
            └─四级2
----------------------------------------------------------
则需要生成的MD文件内容如下:
规律是:
如果最底层文件夹里只有一个文件,则在该文件夹级别名下面添加文件名,然后加一个空行
如果最底层文件夹里只有多个文件,则在该文件夹级别名下面分别添加每个文件名,每个文件名后加一个空行
就像下面红色字部分: 四级1下有两个文件,    四级2下有三个文件

----------------------------------------------------------
# 顶级 #
## 一级1 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
四级文件1

四级文件2


##### 四级2 #####
四级文件1

四级文件2

四级文件3


#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

## 一级2 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

## 一级3 ##
### 二级1 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####
### 二级2 ###
#### 三级1 ####
##### 四级1 #####
##### 四级2 #####
#### 三级2 ####
##### 四级1 #####
##### 四级2 #####

TOP

  1. dir 顶级 -dir -rec -name | sort | %{
  2. 1 .. $_.split("\").count + 1 | foreach{ $mark = "#" + $mark }
  3. $mark + ' ' + $_.split("\")[-1] + ' ' + $mark
  4. rv mark
  5. $fullpath="顶级\"+$_
  6. if ((dir -dir $fullpath).count -eq 0){
  7. foreach($i in (dir $fullpath -file)){$i.basename+"`r`n"}
  8. }
  9. } | tee -var s
  10. [console]::readkey()
复制代码
我用(dir -dir).count -eq 0 来判断是否是底层文件夹,感觉很呆
想用test-path,用法上还有点疑问,还需要搜索学习...

TOP

回复 7# for_flr


多谢大侠帮忙, 可以执行成功!  但是Markdow 最多只能支持6级标题, 再多就不显示了, 所以最后一级识别和显示没有意义了

现在看来,只能用复杂的XML格式来搞了, XML相比MD的显示代码, 就是标签是一对,前后两个, 感觉实现难度又提高了

大侠能帮试试, 生成下面的XML代码吗? 只显示文件夹层次就可以了, 最底层的文件识别不需要了,

提前感谢!
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <opml version="1.0"
  3.     xmlns:sx="http://www.microsoft.com/schemas/rss/sse">
  4.     <head>
  5.         <title>顶级</title>
  6.     </head>
  7.     <body>
  8.         <outline text="一级1">
  9.             <outline text="二级1">
  10.                 <outline text="三级1">
  11.                     <outline text="四级1">
  12.                     </outline>
  13.                     <outline text="四级2">
  14.                     </outline>
  15.                 </outline>
  16.                 <outline text="三级2">
  17.                     <outline text="四级1">
  18.                     </outline>
  19.                     <outline text="四级2">
  20.                     </outline>
  21.                 </outline>
  22.             </outline>
  23.             <outline text="二级2">
  24.                 <outline text="三级1">
  25.                     <outline text="四级1">
  26.                     </outline>
  27.                     <outline text="四级2">
  28.                     </outline>
  29.                 </outline>
  30.                 <outline text="三级2">
  31.                     <outline text="四级1">
  32.                     </outline>
  33.                     <outline text="四级2">
  34.                     </outline>
  35.                 </outline>
  36.             </outline>
  37.         </outline>
  38.         <outline text="一级2">
  39.             <outline text="二级1">
  40.                 <outline text="三级1">
  41.                     <outline text="四级1">
  42.                     </outline>
  43.                     <outline text="四级2">
  44.                     </outline>
  45.                 </outline>
  46.                 <outline text="三级2">
  47.                     <outline text="四级1">
  48.                     </outline>
  49.                     <outline text="四级2">
  50.                     </outline>
  51.                 </outline>
  52.             </outline>
  53.             <outline text="二级2">
  54.                 <outline text="三级1">
  55.                     <outline text="四级1">
  56.                     </outline>
  57.                     <outline text="四级2">
  58.                     </outline>
  59.                 </outline>
  60.                 <outline text="三级2">
  61.                     <outline text="四级1">
  62.                     </outline>
  63.                     <outline text="四级2">
  64.                     </outline>
  65.                 </outline>
  66.             </outline>
  67.         </outline>
  68.         <outline text="一级3">
  69.             <outline text="二级1">
  70.                 <outline text="三级1">
  71.                     <outline text="四级1">
  72.                     </outline>
  73.                     <outline text="四级2">
  74.                     </outline>
  75.                 </outline>
  76.                 <outline text="三级2">
  77.                     <outline text="四级1">
  78.                     </outline>
  79.                     <outline text="四级2">
  80.                     </outline>
  81.                 </outline>
  82.             </outline>
  83.             <outline text="二级2">
  84.                 <outline text="三级1">
  85.                     <outline text="四级1">
  86.                     </outline>
  87.                     <outline text="四级2">
  88.                     </outline>
  89.                 </outline>
  90.                 <outline text="三级2">
  91.                     <outline text="四级1">
  92.                     </outline>
  93.                     <outline text="四级2">
  94.                     </outline>
  95.                 </outline>
  96.             </outline>
  97.         </outline>
  98.     </body>
  99. </opml>
复制代码

TOP

密密麻麻的尖括号,看得头皮发麻,坐等大佬的代码吧。
我想借楼问一下,为什么你的ps代码总是整整齐齐,大小写分明,是用什么格式化工具吗

TOP

回复 9# for_flr


    用了一款powershell studio软件格式化了一下,

TOP

回复 9# for_flr


上面的xml的标签是分在两行上的, 如果并成一行, 要整齐,规律的多, 下面并了一下最后那层标签
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <opml version="1.0"
  3.     xmlns:sx="http://www.microsoft.com/schemas/rss/sse">
  4.     <head>
  5.         <title>顶级</title>
  6.     </head>
  7.     <body>
  8.         <outline text="一级1">
  9.             <outline text="二级1">
  10.                 <outline text="三级1">
  11.                     <outline text="四级1"></outline>
  12.                     <outline text="四级2"></outline>
  13.                 </outline>
  14.                 <outline text="三级2">
  15.                     <outline text="四级1"></outline>
  16.                     <outline text="四级2"></outline>
  17.                 </outline>
  18.             </outline>
  19.             <outline text="二级2">
  20.                 <outline text="三级1">
  21.                     <outline text="四级1"></outline>
  22.                     <outline text="四级2"></outline>
  23.                 </outline>
  24.                 <outline text="三级2">
  25.                     <outline text="四级1"></outline>
  26.                     <outline text="四级2"></outline>
  27.                 </outline>
  28.             </outline>
  29.         </outline>
  30.         <outline text="一级2">
  31.             <outline text="二级1">
  32.                 <outline text="三级1">
  33.                     <outline text="四级1"></outline>
  34.                     <outline text="四级2"></outline>
  35.                 </outline>
  36.                 <outline text="三级2">
  37.                     <outline text="四级1"></outline>
  38.                     <outline text="四级2"></outline>
  39.                 </outline>
  40.             </outline>
  41.             <outline text="二级2">
  42.                 <outline text="三级1">
  43.                     <outline text="四级1"></outline>
  44.                     <outline text="四级2"></outline>
  45.                 </outline>
  46.                 <outline text="三级2">
  47.                     <outline text="四级1"></outline>
  48.                     <outline text="四级2"></outline>
  49.                 </outline>
  50.             </outline>
  51.         </outline>
  52.         <outline text="一级3">
  53.             <outline text="二级1">
  54.                 <outline text="三级1">
  55.                     <outline text="四级1"></outline>
  56.                     <outline text="四级2"></outline>
  57.                 </outline>
  58.                 <outline text="三级2">
  59.                     <outline text="四级1"></outline>
  60.                     <outline text="四级2"></outline>
  61.                 </outline>
  62.             </outline>
  63.             <outline text="二级2">
  64.                 <outline text="三级1">
  65.                     <outline text="四级1"></outline>
  66.                     <outline text="四级2"></outline>
  67.                 </outline>
  68.                 <outline text="三级2">
  69.                     <outline text="四级1"></outline>
  70.                     <outline text="四级2"></outline>
  71.                 </outline>
  72.             </outline>
  73.         </outline>
  74.     </body>
  75. </opml>
复制代码

TOP

本帖最后由 5i365 于 2022-3-11 18:40 编辑

回复 9# for_flr


    找了一篇代码, 感觉有戏

水平有限, 但是感觉看明白了下面代码, 10行代码就能搞定!

组件下载: 64位系统要下载64位的组件
https://www.chilkatsoft.com/downloads_DotNet.asp
64位直接下载
https://chilkatdownload.com/9.5. ... net48-9.5.0-x64.zip
32位直接下载
https://chilkatdownload.com/9.5. ... t48-9.5.0-win32.zip

演示如何使用标记路径创建XML文档。
  1. Add-Type -Path "C:\chilkat\ChilkatDotNet47-9.5.0-x64\ChilkatDotNet47.dll"
  2. $xml = New-Object Chilkat.Xml
  3. $xml.Tag = "world"
  4. # This example uses features introduced in v9.5.0.64
  5. $xml.NewChild2("north_america|united_states|california|sacremento","capital")
  6. $xml.NewChild2("north_america|united_states|california|los_angeles","City of Angels")
  7. $xml.NewChild2("north_america|united_states|california|san_francisco","Silicon Valley")
  8. $xml.NewChild2("north_america|united_states|california|san_diego","Birthplace of California")
  9. $xml.NewChild2("north_america|united_states|illinois|chicago","Windy City")
  10. $($xml.GetXml())
  11. # Produces the following XML
  12. #
  13. # <?xml version="1.0" encoding="utf-8" ?>
  14. # <world>
  15. #     <north_america>
  16. #         <united_states>
  17. #             <california>
  18. #                 <sacremento>capital</sacremento>
  19. #                 <los_angeles>City of Angels</los_angeles>
  20. #                 <san_francisco>Silicon Valley</san_francisco>
  21. #                 <san_diego>Birthplace of California</san_diego>
  22. #             </california>
  23. #             <illinois>
  24. #                 <chicago>Windy City</chicago>
  25. #             </illinois>
  26. #         </united_states>
  27. #     </north_america>
  28. # </world>
  29. #
复制代码

TOP

使用递归
  1. cls
  2. function Build-DirXml([System.IO.DirectoryInfo]$dir,$depth){
  3.     #当前文件夹开始
  4.     $str = ''
  5.     for($i = 0; $i -lt $depth; $i++) { $str += "`t" }
  6.     $str += '<outline text="{0}">' -f $dir.Name
  7.     #递归子文件夹
  8.     $dirs = $dir.GetDirectories()
  9.     $depth_tmp = $depth
  10.     if($dirs.Count -gt 0){
  11.         $sub_str = "`r`n" ; ++$depth_tmp
  12.         $dirs | foreach { $sub_str += Build-DirXml -dir $_ -depth $depth_tmp }
  13.     } else { $sub_str = ''}  
  14.     #当前文件夹结束
  15.     $str += $sub_str
  16.     if($dirs.Count -gt 0){ for($i = 0; $i -lt $depth; $i++) { $str += "`t" } }
  17.     $str += '<outline/>' + "`r`n"
  18.     #递归结束
  19.     return $str
  20. }
  21. Build-DirXml -dir (Get-Item '顶级') -depth 0
复制代码
1

评分人数

TOP

回复 13# went


    感谢大侠支招, 我的这个是不规则的XML吗? 他的前面是这样的, 还是有相应的属性可以设置?

    <head>
        <title>顶级</title>
    </head>
    <body>

        <outline text="一级1">

TOP

回复 14# 5i365


    啥意思,加上head,title,body?

TOP

返回列表