返回列表 发帖
回复 15# went


    我也说不明白, 您看一下 上面 11楼 的XML前面部分, 第一到第七行

TOP

回复 16# 5i365


    那就生成和上面一模一样的xml
cls
function Build-DirXml([System.IO.DirectoryInfo]$dir,$depth){
    #当前文件夹开始
    if($depth -eq 0 ){
        $str =  '<?xml version="1.0" encoding="UTF-8"?>' + "`r`n"
        $str += '<opml version="1.0" xmlns:sx="http://www.microsoft.com/schemas/rss/sse">' + "`r`n`t"
        $str += '<head>' + "`r`n`t`t" + ('<title>{0}</title>' -f $dir.Name) + "`r`n`t" + '</head>' + "`r`n`t" + "<body>"
        $end_str = '</body>' + "`r`n" + '</opml>'
        ++$depth
    } else {
        $str = '' ; $end_str = ''
        for($i = 0; $i -lt $depth; $i++) { $str += "`t" }
        $str += '<outline text="{0}">' -f $dir.Name
        $end_str = '<outline/>' + "`r`n"
    }
    #递归子文件夹
    $dirs = $dir.GetDirectories()
    $depth_tmp = $depth
    if($dirs.Count -gt 0){
        $sub_str = "`r`n" ; ++$depth_tmp
        $dirs | foreach { $sub_str += Build-DirXml -dir $_ -depth $depth_tmp }
    } else { $sub_str = ''}  
    #当前文件夹结束
    $str += $sub_str
    if($dirs.Count -gt 0){ for($i = 0; $i -lt $depth; $i++) { $str += "`t" } }
    #递归结束
    return $str + $end_str
}
Build-DirXml -dir (Get-Item '顶级') -depth 0 | Out-File '0.xml'COPY
1

评分人数

TOP

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

回复 17# went


    大侠太牛X了, 生成的文件和原文件一模一样! 貌似没有用到XML节点之类的函数,

想问一下, 从11楼的XML代码, 反向生成文件夹可以实现吗? 感觉这个反向操作应该要使用XML节点来操作了!

已开新贴 http://www.bathome.net/viewthrea ... mp;extra=#pid252574

TOP

本帖最后由 5i365 于 2022-3-13 09:07 编辑

回复 17# went


大侠好, 我想在除 顶级 文件夹外的所有文件夹的标签里添加上文件夹的相对路径, 可以在上面代码的基础上简单修改实现吗? 具体描述如下, 再次感谢

示例文件夹结构:
C:\USERS\ADMINISTRATOR\DESKTOP\顶级
└─一级1
    └─二级1
        └─三级1
            ├─四级1
            │  ├─五级1
            │  │  └─六级1
            │  └─五级2
            └─四级2
_____________________________________________________________________________________________________________________________________
1.最底层的标签变化:
如果文件夹里没有子文件夹了, 以前的标签是一对, 现在变为 只要左标签, 后面加 /
例如下面的:    四级2    五级2   六级1    的标签

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
    <head>
        <title>顶级</title>
    </head>
    <body>
        <outline text="顶级">
            <outline text="一级1">
                <outline text="二级1">
                    <outline text="三级1">
                        <outline text="四级1">
                            <outline text="五级1">
                                <outline text="六级1"/>
                            </outline>
                            <outline text="五级2"/>
                        </outline>
                        <outline text="四级2"/>
                    </outline>
                </outline>
            </outline>
        </outline>
    </body>
</opml>

_____________________________________________________________________________________________________________________________________
2.在标签内添加注释文本和路径:
       
A.添加注释文本:【能否在代码前加个switch开关,设1时: 按下面情况添加; 设2时: 任何情况下都添加,但是添加的内容只有一个字; 设3时, 功能关闭,不添加】
除顶级之外的其它所有级别的文件夹下, 如果存在txt文件【没有就不添加了】, 则获取里面的内容, 回车符替换为  &#10;  , 引号"替换为  &quot;   如果有多个txt文件则先把它们拼接在一起
例如为一级1文件夹添加的注释文本, 【文本用""括起来,文本前边添加note=
note="我是 顶级\一级1 文件夹下的txt文件中的内容&#10;我是第二段"

B. 添加路径:【能否在代码前加个开关,开的时候就加,关的时候就不加了】
除顶级之外的其它所有级别的文件夹标签内,  添加上它所在的位置的路径
例如下面为 一级1 文件夹添加的路径,  即:红色字部分为该文件夹相对顶级文件夹的位置, 【路径前面加上 type="link" url="file:,后面加"】
type="link" url="file:顶级/一级1"
_____________________________________________________________________________________________________________________________________
供测试的示例文件夹 https://send.cm/d/9PET
期待的最终效果:  

<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
    <head>
        <title>顶级</title>
    </head>
    <body>
        <outline text="顶级">
            <outline text="一级1" note="我是 顶级\一级1 文件夹下的txt文件中的内容&#10;我是第二段" type="link" url="file:顶级/一级1">
                <outline text="二级1" note="我是 顶级\一级1\二级1 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1">
                    <outline text="三级1" note="我是 顶级\一级1\二级1\三级1 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1">
                        <outline text="四级1" note="我是 顶级\一级1\二级1\三级1\四级1 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1/四级1">
                            <outline text="五级1" note="我是 顶级\一级1\二级1\三级1\四级1\五级1 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1/四级1/五级1">
                                <outline text="六级1" note="我是 顶级\一级1\二级1\三级1\四级1\五级1\六级1 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1/四级1/五级1/六级1"/>
                            </outline>
                            <outline text="五级2" note="我是 顶级\一级1\二级1\三级1\四级1\五级2 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1/四级1/五级2"/>
                        </outline>
                        <outline text="四级2" note="我是 顶级\一级1\二级1\三级1\四级2 文件夹下的txt文件中的内容" type="link" url="file:顶级/一级1/二级1/三级1/四级2"/>
                    </outline>
                </outline>
            </outline>
        </outline>
    </body>
</opml>
_____________________________________________________________________________________________________________________________________

TOP

本帖最后由 5i365 于 2022-3-14 21:57 编辑

回复 17# went


自己尝试搞了一下,  有两个问题实在搞不定: 期待路过的高手指点一下迷津, 非常感谢!
第 17 18 19 行
1   $url 变量值: 取到了整个路径, 还要删除 顶级 之前的路径
2   如何让body标签下面第一层也从  顶级  开始,即变成下面这样, 现在红字部分是  一级1
<opml version="1.0">
    <head>
        <title>顶级</title>
    </head>
    <body>
        <outline text="顶级">
#@&cls&powershell "gc '%~0'|out-string|iex"&pause&exit
function Build-DirXml([System.IO.DirectoryInfo]$dir, $depth)
{
#当前文件夹开始
if ($depth -eq 0)
{
$str = '<?xml version="1.0" encoding="UTF-8"?>' + "`r`n"
$str += '<opml version="1.0" xmlns:sx="http://www.microsoft.com/schemas/rss/sse">' + "`r`n`t"
$str += '<head>' + "`r`n`t`t" + ('<title>{0}</title>' -f $dir.Name) + "`r`n`t" + '</head>' + "`r`n`t" + "<body>"
$end_str = '</body>' + "`r`n" + '</opml>'
++$depth
}
else
{
$str = ''; $end_str = ''
for ($i = 0; $i -lt $depth; $i++) { $str += "`t" }
$url = $dir.fullname
$note = (gci "$url\*.txt" | ForEach { gc -enc UTF8 $_; "" }) -join '&#10;' -replace '"', '&quot;'
$str += '<outline text="{0}" note="{1}" type="link" url="file:{2}">' -f $dir, $note, $url
$end_str = '</outline>' + "`r`n"
}
#递归子文件夹
$dirs = $dir.GetDirectories()
$depth_tmp = $depth
if ($dirs.Count -gt 0)
{
$sub_str = "`r`n"; ++$depth_tmp
$dirs | foreach { $sub_str += Build-DirXml -dir $_ -depth $depth_tmp }
}
else { $sub_str = '' }
#当前文件夹结束
$str += $sub_str
if ($dirs.Count -gt 0) { for ($i = 0; $i -lt $depth; $i++) { $str += "`t" } }
#递归结束
return $str + $end_str
}
Build-DirXml -dir (Get-Item '顶级') -depth 0 | Out-File 'ok.opml' -enc utf8COPY

TOP

回复 18# 5i365


上面的问题1 在输出前,用下面的方式搞定了, 感觉应该还有更简单的方法, 现在,只有问题2 没有搞定, 那个圈子转不过弯来  
$d = Get-Item '顶级'
(Build-DirXml -dir $d -depth 0).replace($d,"顶级") | Out-File 'OK.opml' -enc utf8

TOP

回复 17# went


第二个问题也搞定了, 所有的问题, 全部搞定了!
将第10行按成下面的两行代码

                $str += '<outline text="{0}">' -f $dir.Name
                $end_str = '</outline>' + "`r`n" + '</body>' + "`r`n" + '</opml>'

TOP

返回列表