【问题标题】:how to insert a single line in the end of multiple .txt files in a single folder using batch or vbs?如何使用批处理或 vbs 在单个文件夹中的多个 .txt 文件的末尾插入一行?
【发布时间】:2013-10-16 19:07:15
【问题描述】:

我在记事本上有多个文本文件放在一个目录中,即 d:\documents。我想要一个批处理文件在每个文件的末尾添加一行,但它们超过 60 或 70 个。只需要一个批处理文件自动添加此行。请有任何想法???

【问题讨论】:

    标签: batch-file text vbscript insert lines


    【解决方案1】:

    您可能不得不担心最后一行末尾缺少换行符的文件。如果你只是追加一个新行,它将被追加到最后一行而不是添加一个新行。

    以下内容适用于任何文件,无论最后一行是否以换行符结尾。当且仅当原始文件的最后一行缺少终止换行符时,它才会在附加新行之前有条件地附加一个换行符。

    @echo off
    setlocal enableDelayedExpansion
    :: Define LF to contain a newline character
    set LF=^
    
    
    :: The above two blank lines are critical - DO NOT REMOVE
    
    for %%F in (d:\documents\*.txt) do (
      findstr /v "!LF!" "%%F" >nul && (echo()
      (echo Your new line goes here)
    )>>"%%F"
    

    如果任何文件名包含!,上述方法将不起作用。万一您确实有包含! 的文件名,那么您将需要在循环中打开和关闭延迟扩展。

    @echo off
    setlocal
    :: Define LF to contain a newline character
    set LF=^
    
    
    :: The above two blank lines are critical - DO NOT REMOVE
    
    for %%F in (d:\documents\*.txt) do (
      set "file=%%F"
      setlocal enableDelayedExpansion
      findstr /v "!LF!" "!file!" >nul && (echo()
      endlocal
      (echo Your new line goes here)
    )>>"%%F"
    

    更新

    正如 foxidrive 在他的评论中指出的那样,上述解决方案将以 <CR><LF> 结尾的 Windows 样式行附加到以 <LF> 结尾的行的 Unix 样式文件中。这种混合线型可能是不可取的。

    下面的代码将正确地附加带有正确行终止符的行。该代码假定任何包含<CR> 的文件都是Windows 格式。它还假定任何不包含 <LF> 的文件都是 Windows 格式。

    @echo off
    setlocal disableDelayedExpansion
    
    set "line=YOUR NEW LINE GOES HERE"
    
    :: Define LF to contain a newline character
    set LF=^
    
    
    :: The above two blank lines are critical - DO NOT REMOVE
    
    for %%F in (d:\test\test\*.txt) do (
      set "unix="
      findstr $ "%%F" >nul || cmd /v:on /c "findstr "!LF!" "%%F" >nul" && set unix=1
      cmd /v:on /c findstr /v "!LF!" "%%F" ^>nul && (
        if defined unix (cmd /v:on /c "echo(&echo(!lf!"|findstr /v $) else (echo()
      )
      if defined unix (
        cmd /v:on /c "echo(&echo(!line!!lf!"|findstr /v $
      ) else (
        setlocal enableDelayedExpansion
        echo(!line!
        endlocal
      )
    )>>"%%F"
    

    【讨论】:

    • findstr Dave 有一个很好的用法 - 请参阅我的答案。
    • @foxidrive - 关闭,但该技术不可靠。请参阅我对您的回答的评论。
    • 戴夫,您的代码也不能可靠地处理 Unix 文件。它附加 CRLF 集并因此创建混合文件。
    • @foxidrive - 确实,如您所说,unix 风格的文件可能会变成混合文件。但它会有正确的行数。混合性质可能是也可能不是问题。
    • @foxidrive - 我添加了一个不创建混合文件的解决方案。
    【解决方案2】:

    试试这样的:

    @echo off
    
    >"%TEMP%\newline.txt" echo.
    
    pushd "C:\documents"
    for %%f in (*.txt) do copy /b "%%~f" + "%TEMP%\newline.txt" "%%~f"
    popd
    
    del "%TEMP%\temp.txt"
    
    • >"%TEMP%\temp.txt" echo.:创建一个(临时)文件,其中只有一个换行符。

    • pushd "C:\documents":将当前工作目录更改为C:\documents

    • for %%f in (*.txt) do ...:遍历当前目录下的所有文本文件。

    • copy /b "%%~f" + "%TEMP%\newline.txt" "%%~f":将当前文件的内容加上换行符从临时文件复制回当前文件。

    【讨论】:

      【解决方案3】:

      如果没有,此代码将在每个文件的末尾添加一个 CRLF,
      然后将文本This is the last line 添加为每个文件的最后一行。

      @echo off
      for /f "delims=" %%a in ('dir *.txt /a:-d /b') do (
         findstr /v ".*$" "%%a" >nul && (>>"%%a" echo.)
         >>"%%a" echo This is the last line
      )
      

      【讨论】:

      • 使用 FINDSTR /V ".*$" 检测最后一行缺少换行符的文件仅适用于每行末尾有 <CR><LF> 的基于 Windows 的文件。以<LF> 结尾的Unix 样式文件会错误地得到额外的行,因为$ 锚点只是寻找<CR> 字符。在 Windows 机器上找到 Unix 风格的文件并不少见。
      • @dbenham 是的,Dave 没错,它不会以同样的方式处理 Unix 格式的文件。但是,它在 Windows 文件上运行良好,并且不需要延迟扩展。
      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 2021-04-08
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2016-10-23
      • 1970-01-01
      相关资源
      最近更新 更多