【发布时间】:2013-10-16 19:07:15
【问题描述】:
我在记事本上有多个文本文件放在一个目录中,即 d:\documents。我想要一个批处理文件在每个文件的末尾添加一行,但它们超过 60 或 70 个。只需要一个批处理文件自动添加此行。请有任何想法???
【问题讨论】:
标签: batch-file text vbscript insert lines
我在记事本上有多个文本文件放在一个目录中,即 d:\documents。我想要一个批处理文件在每个文件的末尾添加一行,但它们超过 60 或 70 个。只需要一个批处理文件自动添加此行。请有任何想法???
【问题讨论】:
标签: batch-file text vbscript insert lines
您可能不得不担心最后一行末尾缺少换行符的文件。如果你只是追加一个新行,它将被追加到最后一行而不是添加一个新行。
以下内容适用于任何文件,无论最后一行是否以换行符结尾。当且仅当原始文件的最后一行缺少终止换行符时,它才会在附加新行之前有条件地附加一个换行符。
@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 有一个很好的用法 - 请参阅我的答案。
试试这样的:
@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":将当前文件的内容加上换行符从临时文件复制回当前文件。
【讨论】:
如果没有,此代码将在每个文件的末尾添加一个 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
)
【讨论】:
<CR><LF> 的基于 Windows 的文件。以<LF> 结尾的Unix 样式文件会错误地得到额外的行,因为$ 锚点只是寻找<CR> 字符。在 Windows 机器上找到 Unix 风格的文件并不少见。