标题: [问题求助] 如何根据xml文件的结构来生成对应的文件夹 [打印本页]
作者: 5i365 时间: 2022-3-12 12:21 标题: 如何根据xml文件的结构来生成对应的文件夹
本帖最后由 5i365 于 2022-3-12 13:10 编辑
这是另一个贴子的反向生成, http://www.bathome.net/redirect. ... 1826&pid=252441 went大侠在贴子的最后已经成功搞定, 再次感谢!
期待高手一展身手, 提前感谢!
XML文件内容如下:- <?xml version="1.0" encoding="UTF-8"?>
- <opml version="1.0"
- xmlns:sx="http://www.microsoft.com/schemas/rss/sse">
- <head>
- <title>顶级</title>
- </head>
- <body>
- <outline text="一级1">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- <outline text="一级2">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- <outline text="一级3">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- </body>
- </opml>
复制代码
最终要生成的文件夹结构如下:- 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
复制代码
作者: 5i365 时间: 2022-3-12 12:41
本帖最后由 5i365 于 2022-3-12 12:43 编辑
下面的代码能取到顶级的值, 但是一到递归就蒙圈子 求高手接力- $x = @'
- <?xml version="1.0" encoding="UTF-8"?>
- <opml version="1.0"
- xmlns:sx="http://www.microsoft.com/schemas/rss/sse">
- <head>
- <title>顶级</title>
- </head>
- <body>
- <outline text="一级1">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- <outline text="一级2">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- <outline text="一级3">
- <outline text="二级1">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- <outline text="二级2">
- <outline text="三级1">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- <outline text="三级2">
- <outline text="四级1"></outline>
- <outline text="四级2"></outline>
- </outline>
- </outline>
- </outline>
- </body>
- </opml>
- '@
- $xmldata = [xml]$x
- $xmldata.SelectNodes("opml/head/title")
复制代码
作者: idwma 时间: 2022-3-12 14:35
递归学会了来试试- $a=$xmldata.SelectNodes("opml/body").item(0)
- function md4xml(){
- $args[0].ChildNodes|%{
- $p+='\'+$_.text
- mkdir ".$p"
- md4xml $_
- rv p
- }
- }
- md4xml $a
复制代码
作者: 5i365 时间: 2022-3-12 16:07
本帖最后由 5i365 于 2022-3-12 16:09 编辑
回复 3# idwma
感谢大侠支招, 真是看不懂了, 怎么函数md4xml里面还有md4xml函数
代码执行后,没有建顶级文件夹,下面这个$top应该加在哪里?
$top=$xmldata.SelectNodes("opml/head/title")
另外, 执行之后, 我再次执行会扫码报错, 能实现已经有的文件夹,就不要创建了, 只新建没有的吗
作者: idwma 时间: 2022-3-12 16:28
回复 4# 5i365
也不知道为什么要函数里套函数- function md4xml(){
- $args[0].ChildNodes|%{
- if($_.title -eq $null){
- $p+='\'+$_.text
- if(!(test-path ".$pp$p")){mkdir ".$pp$p"}
- md4xml $_
- rv p
- }else{
- $pp='\'+$_.title
- if(!(test-path ".$pp")){mkdir ".$pp"}
- }
- }
- }
- md4xml $xmldata.ChildNodes.Item(1)
复制代码
作者: went 时间: 2022-3-12 23:22
简单的递归原理, 1+...+100
递归必须要有递归出口,不然会造成死循环- function fn($num){
- if($num -eq 1){
- Write-Host '递归出口'
- return 1
- }
- Write-Host "${num}压栈"
- $sum = fn -num ($num-1)
- Write-Host "${num}出栈"
- return $num + $sum
- }
-
- fn(100)
复制代码
作者: 5i365 时间: 2022-3-13 06:20
本帖最后由 5i365 于 2022-3-13 06:22 编辑
回复 6# went
非常感谢went大侠赐教, 还是似懂非懂, 先mark收藏,
foreach遍历前些日子刚理解了, 现在又出一个递归拦路虎
感觉在实现某些功能上, PS的代码量要比其它的脚本语言少多了, 而且越少的PS代码越难理解
作者: 5i365 时间: 2022-3-13 08:42
本帖最后由 5i365 于 2022-3-13 08:45 编辑
回复 5# idwma
大侠好, 能否再给代码加点 AI智能 吗? 描述如下:
在根据xml创建文件夹时,先遍历搜索 顶级文件夹下有没有同名的文件夹:
A.有一个的话, 就不新建了, 把存在的文件夹移过来
B.没有的话,再新建
C.有多个的话,就回显这N个文件夹的路径,每个路径前有序号,询问移哪个文件夹,输入序号回车,就移过去了
最好能把移动的中间路径过程定向输出到log.txt, 怕到时候找不到了
这次感觉有点难度了, 估计把上面的每个功能定义为一个函数, 然后在上面的代码中, 函数里面套多个函数了
作者: idwma 时间: 2022-3-13 17:29
回复 8# 5i365
移过来移过去,往哪移?
作者: 5i365 时间: 2022-3-13 17:40
回复 9# idwma
比如, 按XML中的节点, 顶级下需要创建一个 一级1 的文件夹, 但是这个文件夹,已经在顶级的一个子文件夹中存在了, 就把它移过来
作者: 5i365 时间: 2022-3-13 18:08
回复 9# idwma
这个对应的实际使用情况是, 已经执行过代码一次了, 但是我后来又修改或移动了XML中某个节点了, 再次执行代码, 实际上, 要建的文件夹已经存在了, 所以就不能新建它了, 要找到它, 移到要新建的地方
作者: idwma 时间: 2022-3-13 18:39
本帖最后由 idwma 于 2022-3-13 20:23 编辑
回复 11# 5i365 - function md4xml(){
- $args[0].ChildNodes|%{
- if($_.title -eq $null){
- $p+='\'+$_.text
- if(!(test-path ".$pp$p")){
- $a=dir -rec -inc $p.Split('\')[-1] ".$pp"
- if($a.count -gt 1){
- $a|%{"{0} {1}" -f $j++,$_.fullname}
- "-> .$pp$p"
- [int]$i=read-host
- if($i -match '\d'){move $a[$i].fullname ".$pp$p\.."; ac log.txt $("{0} -> {1}" -f $a[$i].fullname,".$pp$p")}
- rv i,j
- }elseif($a -ne $null){move $a.fullname ".$pp$p\.."; ac log.txt $("{0} -> {1}" -f $a.fullname,".$pp$p")}else{mkdir ".$pp$p"}
- }
- md4xml $_
- rv p
- }else{
- $pp='\'+$_.title
- if(!(test-path ".$pp")){mkdir ".$pp"}
- }
- }
- }
- md4xml $xmldata.ChildNodes.Item(1)
复制代码
作者: 5i365 时间: 2022-3-13 19:41
本帖最后由 5i365 于 2022-3-13 19:43 编辑
回复 12# idwma
感谢大侠支招, 还没有测试, 过两天再试, 因为我用的notepad2不管怎么试都会存成UTF8的乱码, 别的代码就没事, 估计是XML的内容+bat格式出错了, 已经反馈开发者了
系统已经改注册表, 替换了系统自带的记事本了, 暂时不想使用其它的软件, 用powershell studio 天生对中文支持就不好, 也经常乱码
作者: 5i365 时间: 2022-3-14 08:32
本帖最后由 5i365 于 2022-3-14 08:33 编辑
回复 12# idwma
notepad2开发者回复了, 问题临时解决了, 我执行代码后,对于一级文件夹, 只创建了一个一级1, 没有其它两个, 下面是完整代码复制代码
作者: idwma 时间: 2022-3-14 13:31
回复 14# 5i365
这里面子文件名不都是一样的吗?一样不就只保留一个了吗?
作者: 5i365 时间: 2022-3-14 13:52
回复 15# idwma
感谢大侠提醒, 这个逻辑和XML的结构在有同名文件夹时冲突了, 我再想想怎么描述, 确实有规律
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |