我在记事本上有多个文本文件放在一个目录中,即 d:\documents。我想要一个批处理文件在每个文件的末尾添加一行,但它们超过 60 或 70 个。只需要一个批处理文件自动添加这一行。有什么想法吗???
3 回答
您可能不得不担心最后一行末尾缺少换行符的文件。如果您只是追加一个新行,它将被追加到最后一行而不是添加一个新行。
以下内容适用于任何文件,无论最后一行是否以换行符结尾。当且仅当原始文件的最后一行缺少终止换行符时,它在附加新行之前有条件地附加一个换行符。
@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>
将以<LF>
. 这样的混合线类型可能是不可取的。
下面的代码将正确地附加具有正确行终止符的行。该代码假定任何包含 a 的文件<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"
如果没有,此代码将在每个文件的末尾添加一个 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
)
Try something like this:
@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.
: create a (temporary) file with just a newline in it.pushd "C:\documents"
: change the current working directory toC:\documents
.for %%f in (*.txt) do ...
: iterate over all text files in the current directory.copy /b "%%~f" + "%TEMP%\newline.txt" "%%~f"
: copy the content of the current file plus the newline from the temporary file back to the current file.