Batch file 将文件夹结构索引为HTML的BAT文件
我以前从未编写过BAT文件,但我想做以下工作 在共享网络驱动器上,我们有一个文件/文件夹结构。我希望我的同事能够双击BAT文件。然后,BAT文件应该生成这些文件的HTML索引和链接,以及每个文件夹和子文件夹的标题(不超过三个级别) 我想我已经非常接近谷歌搜索和复制代码了,但是我被困在了标题部分Batch file 将文件夹结构索引为HTML的BAT文件,batch-file,for-loop,Batch File,For Loop,我以前从未编写过BAT文件,但我想做以下工作 在共享网络驱动器上,我们有一个文件/文件夹结构。我希望我的同事能够双击BAT文件。然后,BAT文件应该生成这些文件的HTML索引和链接,以及每个文件夹和子文件夹的标题(不超过三个级别) 我想我已经非常接近谷歌搜索和复制代码了,但是我被困在了标题部分 setlocal EnableDelayedExpansion pushd %~dp0 for /L %%n in (1 1 500) do ( if "!__cd__:~%%n,1!" neq "" s
setlocal EnableDelayedExpansion
pushd %~dp0
for /L %%n in (1 1 500) do (
if "!__cd__:~%%n,1!" neq "" set /a "len=%%n+1"
)
for /r . %%g in (*) do (
setlocal EnableDelayedExpansion
set "absPath=%%g"
set "relPath=!absPath:~%len%!"
for %%F in ("!absPath!") do set "var=%%~dpF"
[MISSING CODE HERE]
echo "<a href='http://linkhere.com/!relPath!'>%%~ng</a>" >>output.txt
endlocal
)
echo %~dp0
popd
pause
这会将每个文件夹和文件名设置为一些变量。我希望每次这些变量中的一个发生变化时,都能用它来回显一个标题,但我似乎无法解决这个问题
也许我完全走错了方向,但我很高兴听到应该怎么做
提前谢谢
编辑> Foxidrive建议我添加文件夹结构和输出的示例 上面的屏幕截图演示了文件夹结构。BAT文件将位于顶部文件夹(称为Standaard formulieren) 输出应该是这种伪HTML格式的东西
<h2 class='header' onClick='showHide(1)'>ABU</h2>
<div id='itemlist1' class='itemlist'>
<ul>
<li><a href='http://link-to-file.com/ABU/filename.doc'>Filename</a></li>
<li><a href='http://link-to-file.com/ABU/filename%202.doc'>Filename 2</a></li>
</ul>
</div>
[etc...]
<h2 class='header' onClick='showHide(9)'>Personeelszaken</h2>
<div id='itemlist9' class='itemlist'>
<h3 class='subheader' onClick='showHide(10)'>Algemeen</h2>
<div id='itemlist10' class='subitemlist'>
<ul>
<li><a href='http://link-to-file.com/Personeelszaken/Algemeen/filename.doc'>Filename</a></li>
<li><a href='http://link-to-file.com/Personeelszaken/Algemeen/filename%202.doc'>Filename 2</a></li>
</ul>
</div>
</div>
[etc...]
ABU
[等等]
萨肯人
阿尔杰明
[等等]
复制HTML不是我的专长,但这应该会创建一种HTML,其中包含足够的信息,可以帮助您实现目标——我希望如此
已编辑:以递归方式包含子目录的完整列表,更正相对路径
@echo off
setlocal enabledelayedexpansion
set "basefolder=d:\Standaard formulieren"
pushd "%basefolder%"
(
for /d /r %%a in (*) do (
pushd "%%a"
echo going into "%%a"
for /r %%b in (*) do (
set "relfolder=%%a"
set "relfolder=!relfolder:%basefolder%\=!"
set "relfolder=!relfolder:\=/!"
set "filename=%%~nb"
set "filename=!filename: =%%20!"
echo ^<li^>^<a href="http://link-to-file.com/!relfolder!/!filename!%%~xb"^>%%~nb^</a^>^</li^>
)
popd
echo leaving "%%a"
)
)>"file.html"
echo done
pause
@echo关闭
延迟扩展
设置“basefolder=d:\standardaard formulieren”
pushd“%basefolder%”
(
对于(*)中的/d/r%%a,请执行以下操作(
pushd“%%a”
回声进入“%%a”
对于(*)中的/r%%b,请执行以下操作(
设置“relfolder=%%a”
设置“relfolder=!relfolder:%basefolder%\=!”
设置“relfolder=!relfolder:\=/!”
设置“文件名=%%~nb”
设置“文件名=!文件名:=%%20!”
回音^^%%~nb^^
)
邻苯二胺
回声离开“%%a”
)
)>“file.html”
回音完成
暂停
Foxidrive解决了这个问题(所以改选他),但这里是我修改的代码,用于网络共享
@echo off
setlocal enabledelayedexpansion
pushd %~dp0
(
for /d /r %%a in (*) do (
pushd "%%a"
set "folder=%%a"
echo ^<h1^>!folder:~25!^</h1^>^<ul^>
for /r %%b in (*) do (
set "filename=%%~nb"
set "filename=!filename: =%%20!"
echo ^<li^>^<a href="http://link-to-file.com/Standaard formulieren/!folder:~25!/!filename!%%~xb"^>%%~nb^</a^>^</li^>
)
popd
echo ^</ul^>
)
)>"file.html"
echo done
pause
@echo关闭
延迟扩展
pushd%~dp0
(
对于(*)中的/d/r%%a,请执行以下操作(
pushd“%%a”
设置“文件夹=%%a”
echo^!文件夹:~25^^
对于(*)中的/r%%b,请执行以下操作(
设置“文件名=%%~nb”
设置“文件名=!文件名:=%%20!”
回音^^%%~nb^^
)
邻苯二胺
回音^
)
)>“file.html”
回音完成
暂停
它依赖于路径中固定数量的字符。在我的例子中是25个字符。您可以提供输入文件夹/文件结构和html文件,而不是读取无法正常工作的代码吗?有人可能会提供工作代码来满足您的需要。这很公平。我会在一分钟内将两者添加到OP中。谢谢。这太棒了,谢谢!另外,我不得不用
pushd%~dp0
替换第一个pushd,以使其与网络共享一起工作,但这正是我问题的答案。此外:我(正确地)接受了这个答案,但它似乎在子文件夹上出了故障。它列出所有项目,但不添加标题。它也不会将子文件夹添加到链接中,因此它变成了PersonelSzaken/file.doc
,而不是正确的PersonelSzaken/Algemeen/file.doc
。我将其更改为包含所有子目录并插入相对路径。网络共享可能需要进一步调整。。。标题超出了我的HTML知识范围,因此我不知道所有项目的正确位置。
@echo off
setlocal enabledelayedexpansion
pushd %~dp0
(
for /d /r %%a in (*) do (
pushd "%%a"
set "folder=%%a"
echo ^<h1^>!folder:~25!^</h1^>^<ul^>
for /r %%b in (*) do (
set "filename=%%~nb"
set "filename=!filename: =%%20!"
echo ^<li^>^<a href="http://link-to-file.com/Standaard formulieren/!folder:~25!/!filename!%%~xb"^>%%~nb^</a^>^</li^>
)
popd
echo ^</ul^>
)
)>"file.html"
echo done
pause