CMD:合并文件 将日期和文件名回显到合并文件

CMD : Merge Files Echo date and file name to merged file

我使用下面的代码将 .cpp 文件合并到 directory.This 代码中,这是超级用户提出问题的结果,但没有回复,因为我的问题是 edited.So 请不要将此问题标记为重复。

  @echo off
  cd C:\test
   echo ^<html^>^<head^>^<style^> pre {page-break-after: always;}  ^</style^>^</head^>^<body^> >merged.html
  for /r %%f in (*.cpp) do (
   echo ^<pre^>
   echo File Name   : //Here i want the file name of each program without .cpp extension 
   echo Description :
   echo Author      : Name
   echo Date        : //Here i want the date associated with each file DD-MM-YYYY
   echo.
   type "%%f"
   echo ^</pre^>
  ) >> merged.html
  echo ^</body^>^</html^> >> merged.html

当前Merged.html文件

File name  : 
Desciption :
Author     : Name
Date       :
 #include 
int main()
{ 
.....

.....

.....
}
Then the second file on the next page .

上述代码有问题

它省略了头文件名,即

在原始文件中我有#include 但在合并文件中 我只是 #include.I 猜测问题是由于“<”和“>”造成的。

我需要什么

我需要在日期之后与合并文件中的每个程序文件关联的日期:(请参阅上面的代码,阅读注释部分)。此外,我还需要在文件名之后的每个程序的文件名:如 abc(没有文件中的扩展名 .cpp)。

@ECHO Off
SETLOCAL

echo ^<html^>^<head^>^<style^> pre {page-break-after: always;}  ^</style^>^</head^>^<body^> >u:\newfile.txt
for /r %%f in (*.cpp) do (
 echo ^<pre^>
 echo File Name   : %%~nf 
 echo Description :
 echo Author      : Name
 FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
 echo.
 type "%%f"
 echo ^</pre^>
)>>u:\newfile.txt
echo ^</body^>^</html^> >> u:\newfile.txt

GOTO :EOF

生成 u:\newfile.txt。我将您的 cd 删除到您的源目录以适合我的测试。

文件名比较简单,只是 %%~nf - 从提示 for 上查看文档

for /?

你没有告诉我们你的日期使用什么格式,所以操纵它本身就是一个主题(已经在 SO 上多次讨论过)。我使用的格式是 dd/mm/yy hh:mm:ss 所以我可以使用默认的 tokens=1delims=。如果看起来很可能,您正在使用 DDDday dd-mm-yy hh:mm:ss 那么您需要使用 FOR /f "tokens=2" %%d IN...

我发现 .cpp 文件中的重定向器没有问题(但请不要假设人们有样本或熟悉它们。)

现在 - 维护它真的很痛苦,因为您需要一遍又一遍地重新编辑文件以插入名称和描述。

试试这个:

@ECHO Off
SETLOCAL

echo ^<html^>^<head^>^<style^> pre {page-break-after: always;}  ^</style^>^</head^>^<body^> >u:\newfile.txt
for /r %%f in (*.cpp) do (
 echo ^<pre^>
 echo File Name   : %%~nf
 SET "namefound="
 FOR /f "tokens=1,2,3delims=|" %%p IN (q29056600.txt) DO IF /i "%%p"=="%%~nxf" (
  echo Description : %%q
  echo Author      : %%r
  SET namefound=Y
 )
 IF NOT DEFINED namefound (
  echo Description :
  echo Author      : Name
 )
 FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
 echo.
 type "%%f"
 echo ^</pre^>
)>>u:\newfile.txt
echo ^</body^>^</html^> >> u:\newfile.txt

GOTO :EOF

文件 q29056600.txt 包含

hello.cpp|Hello World version 1|Fred Nurk
helloworld.cpp|Hello World version Two|Joe Bloggs

即文件名描述自动用竖线分隔。额外代码

  • 清除标志 namefound
  • 读取您的描述文件。如果找到匹配项,则输出描述和作者并设置标志
  • 如果未设置标志(在文件中未找到文件名),则生成您的虚拟行

这是上面的 author 行。您只需要从支持文件中省略作者栏。

@ECHO Off
SETLOCAL

echo ^<html^>^<head^>^<style^> pre {page-break-after: always;}  ^</style^>^</head^>^<body^> >u:\newfile.txt
for /r %%f in (*.cpp) do (
 echo ^<pre^>
 echo File Name   : %%~nf
 SET "namefound="
 FOR /f "tokens=1,2delims=|" %%p IN (q29056600.txt) DO IF /i "%%p"=="%%~nxf" (
  echo Description : %%q
  SET namefound=Y
 )
 IF NOT DEFINED namefound (
  echo Description :
 )
 echo Author      : Name
 FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
 echo.
 type "%%f"
 echo ^</pre^>
)>>u:\newfile.txt
echo ^</body^>^</html^> >> u:\newfile.txt

GOTO :EOF

至于缺少文本的问题:我怀疑您没有使用像 notepad 这样的文本编辑器查看文件,而是使用了一些 HTML 查看器,所以缺少的数据是被解释为 HTML.


如果我对 <> 问题的看法是正确的,那么以下可能是解决方法:

@ECHO Off
SETLOCAL

echo ^<html^>^<head^>^<style^> pre {page-break-after: always;}  ^</style^>^</head^>^<body^> >u:\newfile.txt
for /r %%f in (*.cpp) do (
 echo ^<pre^>
 echo File Name   : %%~nf
 SET "namefound="
 FOR /f "tokens=1,2delims=|" %%p IN (q29056600.txt) DO IF /i "%%p"=="%%~nxf" (
  echo Description : %%q
  SET namefound=Y
 )
 IF NOT DEFINED namefound (
  echo Description :
 )
 echo Author      : Name
 FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
 echo.
 TYPE "%%f"|sed "s/\x3c/\&lt\x3b/g;s/\x3e/\&gt\x3b/g;s/\x25/\&#37\x3b/g"
 echo ^</pre^>
)>>u:\newfile.txt
echo ^</body^>^</html^> >> u:\newfile.txt

GOTO :EOF

请注意,这包括 sed - 一个免费的实用程序。我用的是 GNUSED。