如何创建批处理文件,仅删除特定文件夹中所有.txt文件中的第一行并保留空白

时间:2016-12-27 16:09:30

标签: batch-file

运行批处理文件之前每个文件中的文本:

sometext1
sometext2
sometext3
sometext4

运行批处理文件后每个文件中的文本:

                <-- (vacant line where sometext1 used to be)
sometext2
sometext3
sometext4

2 个答案:

答案 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个字符(不包括换行符)。