运行批处理文件之前每个文件中的文本:
sometext1 sometext2 sometext3 sometext4
运行批处理文件后每个文件中的文本:
<-- (vacant line where sometext1 used to be) sometext2 sometext3 sometext4
答案 0 :(得分:0)
for / f需要预防措施来处理空行 以下批处理使用simple for来迭代所有(重命名的)文件。
@Echo off
CD /D "X:\path\to\your\folder"
Ren "*.txt" "*.txt.bak"
For %%A in (*.txt.bak) Do (
>"%%~dpnA" Echo:
>>"%%~dpnA" More +1 "%%A"
)
更多+1会在附加文件的其余部分时跳过第一行。 修饰符“%% ~nA”从恢复旧文件名的名称中删除附加扩展名.bak。
答案 1 :(得分:0)
有多种选择:
findstr
假设每个文本文件的最后一行都被换行符正确终止,您可以使用以下代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in (".\*.txt") do (
< "%%~F" (
set /P =""
echo/
findstr "^"
) > "%%~F.tmp"
move /Y "%%~F.tmp" "%%~F" > nul
)
endlocal
exit /B
缺点:如果最后一行没有被换行符终止,则使用的findstr
命令会挂起;第一行的长度限制为1023个字符(包括换行符),其余行限制为8192个字符(带换行符)。
more
LotPings已经在their answer中展示了如何使用它,所以这个非常相似:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in (".\*.txt") do (
> "%%~F.tmp" echo/
>>"%%~F.tmp" more +1 "%%~F"
move /Y "%%~F.tmp" "%%~F" > nul
)
endlocal
exit /B
缺点: TAB 字符转换为 SPACE 字符;如果输入文件包含超过65534行,则需要用户交互(按 SPACE 处理下一个65534行);所有行的长度限制为65535个字符(不包括换行符)。
for /F
嵌套的findstr
命令在每一行之前都有一个临时的行号,因为它们永远不会显示为空for /F
而忽略了这一点;稍后删除前缀:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in (".\*.txt") do (
> "%%~F.tmp" (
echo/
for /F "skip=1 delims=" %%L in ('findstr /N "^" "%%~F"') do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
echo(!LINE:*:=!
endlocal
)
)
move /Y "%%~F.tmp" "%%~F" > nul
)
endlocal
exit /B
缺点:这肯定是最慢的方法;所有行的长度限制为8182个字符(不包括换行符)。