【问题标题】:Insert Into Multiple Files in Windows shell script在 Windows shell 脚本中插入多个文件
【发布时间】:2013-07-05 17:47:17
【问题描述】:

基本上我正在尝试编写一个批处理文件来将一些代码插入多个文件中。以下是我要完成的工作的详细信息:
1.输入字符串来自一个文件test.txt。
2. 需要将字符串作为目标文件的第二行插入。
3.目标文件是与批处理文件同向的所有.xml文件。

我想我应该使用 FOR 循环来遍历所有 .xml 文件。像

for /f %%i in ('dir /b *.xml') do ()

我已经阅读了一些教程和帖子,但找不到在循环中向文件添加任何内容的方法。使用 Echo 或 TYPE 似乎不适用于循环中的每个文件。如何循环修改文件?
还要插入一定数量的行,一些帖子说需要将文件放入变量中。但是我的文件非常大,我不想放入变量中。是否有另一种方法可以插入文件中的某一行?

【问题讨论】:

  • The string needs to be added to the second line of destination files. 什么意思?连接,或插入之后还是什么?要添加的文件是单行文件吗?每行是否超过〜8K?您对 TPP 解决方案持开放态度吗?
  • @PeterWright 在这里我想要插入,但实际上任何可以写入第二行的方法都足够好。我编辑了我的帖子以使其更清晰。
  • 您要修改 XML 文件吗?
  • @AnsgarWiechers 是的,我愿意。文件是什么格式有关系吗?
  • 是的。 XML 的结构元素可以从一行中的任何位置开始和/或可以跨越多行。您可以通过在错误的位置插入内容来破坏格式。使用实际上具有 XML 解析功能的语言会好得多。 VBScript 和 PowerShell 随操作系统一起提供。 Perl 或 Python 将是其他不错的选择。

标签: windows for-loop batch-file cmd


【解决方案1】:
@ECHO OFF
SETLOCAL
FOR /f "delims=" %%i IN ('dir /b *.xml') DO (
 SET line2=Y
 (
  FOR /f "usebackqdelims=" %%x IN ("%%i") DO (
  ECHO(%%x
  IF DEFINED line2 TYPE Line2.txt
  SET "line2="
 )
 )>"%%~ni.lmx"
)
GOTO :EOF

这应该对你有用 - 但它会删除空行。

【讨论】:

  • SET line2=Y 中的 Y 是什么意思?还有为什么“%%~ni.lmx”是倒序写的?
  • line2 只是一个环境变量。将其设置为任何值都会使其成为defined。然后,在循环中,写出 XML 的第一行后,写出 line2.txt,因为定义了 line2line2 通过设置为零长度字符串被删除,因此对于 XML 中的其余行,line2.txt 不会输出,因为 line2 未定义。下一个文件 - 再次设置 line2 并处理...%%~ni.lmx 将输出文件设置为与输入相同的名称 (%%~nx) + .lmx 扩展名 - 只是 xml 反转。您不能就地插入,因此会创建一个新文件。只需要重命名..
【解决方案2】:
@echo off
set /P string=< test.txt
for %%a in (*.xml) do (
   (for /F "usebackq tokens=1* delims=:" %%b in ('findstr /N "^" "%%a"') do (
      if %%b equ 2 echo %string%
      set "line=%%c"
      setlocal EnableDelayedExpansion
      echo(!line!
      endlocal
   )) > "%%a.new"
)

新文件具有.xml.new 扩展名;您可以添加几行来删除原始的.xml 文件并将.xml.new 重命名为.xml

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多