批处理文件以交换两个文件之间的信息

时间:2014-05-17 19:33:26

标签: batch-file

我需要一个批处理文件的帮助来完成(我想简单的)从两个"标签之间的主文件中读取信息的任务。并使用此主文件中的信息覆盖其他文件中的当前信息。

这是我的情况作为一个简单的例子: 我有一个名为" template.htmltplt"如果你愿意,这是我的主文件。然后我有一堆其他" .html"文件。

我希望批处理文件:

  1. 浏览所有html文件
  2. 删除<!--Stuff-Start--><!--Stuff-End-->
  3. 之间的所有行
  4. 将template.htmltplt中<!--Stuff-Start--><!--Stuff-End-->标记之间的内容复制到其他html文件中的正确位置。
  5. 这是否可能,如果是这样,怎么办?!

    我没有蝙蝠脚本知识所以评论很好的代码会很棒!

    提前感谢那些愿意提供帮助的人!

    此致 莱因哈特

2 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL

SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "startstring=<!--Stuff-Start-->"
SET "endstring=<!--Stuff-End-->"

:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")

(
SET "block="
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n /r "^" q23715314.txt') DO (
 IF "%%b"=="%endstring%" SET "block="
 IF DEFINED block ECHO(%%b
 IF "%%b"=="%startstring%" SET block=Y
)
)>"%tempfile%r"

FOR /f "delims=" %%t IN ('dir /b /a-d %sourcedir%\*.html') DO (
SET "block="
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n /r "^" "%sourcedir%\%%t"') DO (
 IF "%%b"=="%endstring%" SET "block="
 IF NOT DEFINED block ECHO(%%b
 IF "%%b"=="%startstring%" SET block=Y&TYPE "%tempfile%r"
)
)>"%destdir%\%%~nt.html"

del "%tempfile%*"

GOTO :EOF

不难。

我使用了一个名为q23715314.txt的文件,其中包含我的测试数据:

drop <this> line
<!--Stuff-Start-->
Insert this
and this

    and even <this> line after an empty line
<!--Stuff-End-->
omit this
leave this out

测试.html文件:

leave <this> line

empty line retained
<!--Stuff-Start-->
Replace this
replace this too
    and substitute for <this> line
<!--Stuff-End-->
keep this
retain this too

结果新的.html文件:

leave <this> line

empty line retained
<!--Stuff-Start-->
Insert this
and this

    and even <this> line after an empty line
<!--Stuff-End-->
keep this
retain this too

当然,您需要设置自己的文件和目录名称,我强烈反对尝试对源和目标使用相同的目录。这根本行不通。并且以一个或多个冒号开头的任何.html源代码行都会将这些冒号排除 - 而不是许多.html行以冒号开头,但需要说明......

如何运作 - 逐块。

第一部分似乎很明显。所涉及的目录也是定义​​的,也是目标字符串。

接下来是一个create-a-tempfile例程。只需生成随机文件名,查看目录%temp%中是否存在匹配的文件名。就个人而言,我将temp设置为c:\temp,但代码设计为使用默认值。因此,如果随机数生成器选择18749,则代码将在临时目录中查找任何文件18749...。如果存在此类文件,则选择另一个随机数。如果它没有在临时目录中创建名为18749a的文件。这只是一个占位符。

下一步是将所需的行提取到临时文件。 (block of code)>filename语法将任何数据echo指向filename中的新文件 - 该文件应包含temporay目录中有效文件的完整文件名;例如c:\temp\18749r

块中的代码首先将block设置为空,然后逐行读取文件q23715314.txt,通过在前面添加number:对每行进行编号。这可确保将空行处理为13:,否则将跳过它们。 q23715314.txt并不重要 - 它可以是包含所需模板数据的任何文件。我只是使用qSOquestionnumber.extension,以便将数据保存在与我编写的批处理文件(称为qSOquestionnumber.bat)相关的文件中 - 所以使用file1file2的许多问题可以在出现问题时轻松单独检索。如果您想拥有固定的文件名,临时文件可以是您喜欢的任何有效文件名。但请注意,包含空格和其他一些符号的文件名必须为"quoted"

由于每个行都由number:linefromfile处理,因此使用tokens=1*delims=:会将号码分配给%%alinefromfile%%b

块处理只是将从文件读取的行与定义的开始/结束字符串匹配。最初block"set"为空,因此未定义。匹配startstring后,会为block分配一个值。我使用Y,但任何值都可以。

for从文件中读取下一个字符串时,它会发现现在已定义block,因此它echo es %% b到文件c:\temp\18749r。这将一直持续到找到endstringblock "set"再次清空时;因此未定义且echo c:\temp\18749r不再types

第二个区块的内部相似,但是相反。它从外部循环中选择的文件中重现每一行,直到找到起始字符串,然后block临时文件的内容,并在清除dir /b /a-d时等待结束字符串,从而再次打开回显。 / p>

外部循环只读取"delims="作为源目录 - 只是文件名的目录列表。 %%t将整行分配给for...%%t...do (innerblock)>"%destdir%\%%~nt.html",因此外部循环为echo,它将内部循环所编辑的数据%%t重定向到名称部分为{的文件%%~nt {1}}(.html)指定了目标目录,扩展名为{{1}}

最后,删除了临时文件。

答案 1 :(得分:-3)

您无法使用批处理文件执行此操作。使用视觉基础或珍珠这样的东西。最接近批处理文件可以做到这样的事情是将一个文件的输出用作另一个文件的输入,但这可以作为特定的等待。 Lottopix.has&gt; prevwinum.cgi