【问题标题】:CMD : Merge Files Echo date and file name to merged fileCMD:合并文件回显日期和文件名到合并文件
【发布时间】:2015-03-15 02:29:31
【问题描述】:

我已使用以下代码将 .cpp 文件合并到一个目录中。此代码是超级用户提出的问题的结果,但由于我的问题已被编辑,因此没有回复。所以请不要将此问题标记为重复.

  @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。我猜问题是由于“”。

我需要什么

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

【问题讨论】:

  • 所以你只需要知道如何获取文件最后修改的日期和无扩展名的文件名?那么这和合并有什么关系呢?
  • @SomethingDark 假设如果有 2 个文件 1.pgm_1.cpp date : 5-5-2015 和 2.pgm_2.cpp date : 2-3-2015 。现在在合并时,我在每个程序的顶部添加 4 行。考虑文件 1 的情况:文件名:(这里我需要不带扩展名 .cpp 的 pgm.cpp)然后描述:(我将在将其转换为 pdf 后填写)然后是作者:myName,最后是日期:(这里我需要日期 5-5-2015),就像第二个文件一样。
  • 是的,但这本质上仍然是处理多个文件的情况,因为您对实际的合并过程没有问题。
  • 我有很多 .cpp 文件,很难在每一页上添加日期和文件名。这就是我问这个问题的原因。
  • @SomethingDark 帮我找到解决办法

标签: batch-file cmd command command-prompt text-formatting


【解决方案1】:
@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

即用管道分隔的文件名描述autor。额外的代码

  • 清除标志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。


如果我对 &lt;&gt; 问题的看法是正确的,那么以下可能是一个修复:

@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。

【讨论】:

  • 但是在合并后的文件中只有#include没有头文件()。
  • 我无法重现您的症状。 &lt;iostream.h&gt; 非常适合我。
  • 感谢您的好主意在第二个代码中,我只想拥有每个文件的文件描述。那我该怎么办。作者姓名对所有人都是一样的。
  • 但是我有问题。我刚刚复制了整个代码,它在没有头文件的情况下给出了相同的结果。我认为问题出在我正在使用 .html 文件的 .html 文件上,因为我需要将每个程序都放在一个新页面中。
  • 在某些页面之后的另一个问题,一些程序只能达到 for(i=0 ; 并且下一个程序从那里开始。然后在一些程序给出相同的结果之后,其他程序就没有问题了。
猜你喜欢
  • 2020-11-14
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多