Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Batch可删除文本文件的第一行,而不创建新文件_Batch File - Fatal编程技术网

Batch file Batch可删除文本文件的第一行,而不创建新文件

Batch file Batch可删除文本文件的第一行,而不创建新文件,batch-file,Batch File,这个问题有什么解决办法吗?我看到很多关于删除文本文件的第一行的问题,但所有这些问题都需要创建一个新的文本文件。我需要这样做,因为我的文本文件不断更新新行(通过第二个批处理文件),因此如果脚本创建新文本文件,它可能会意外地用旧文本文件删除一些新行 我可以删除文本文件的第一行而不创建新的行吗?若否,原因为何 仅使用批处理 不应保留空行(如果可能) 特殊字符,如可以删除 通常需要一个新文件,因为请求的操作需要读写。因此,只有一个文件,您将修改您正在阅读的文件!如果您只是担心结果文件是不同的文件,那么

这个问题有什么解决办法吗?我看到很多关于删除文本文件的第一行的问题,但所有这些问题都需要创建一个新的文本文件。我需要这样做,因为我的文本文件不断更新新行(通过第二个批处理文件),因此如果脚本创建新文本文件,它可能会意外地用旧文本文件删除一些新行

我可以删除文本文件的第一行而不创建新的行吗?若否,原因为何

  • 仅使用批处理
  • 不应保留空行(如果可能)
  • 特殊字符,如
    可以删除

通常需要一个新文件,因为请求的操作需要读写。因此,只有一个文件,您将修改您正在阅读的文件!如果您只是担心结果文件是不同的文件,那么可以通过删除原始文件并在完成后重命名新文件来解决。PUSHD和POPD是可选的。。。如果适用,请使用。**未经测试**

pushd "YourFolderName"
set "FileName=YourInFileName.txt"
set "TempFile=SomeTempFileName.txt"
if exist "%TempFile% del /f /q "%TempFile%"
more "%FileName%" +1 > "%TempFile%"
del /f /q "%FileName%"
ren "%TempFile%" "%FileName%"
popd

通常需要一个新文件,因为请求的操作需要读写。因此,只有一个文件,您将修改您正在阅读的文件!如果您只是担心结果文件是不同的文件,那么可以通过删除原始文件并在完成后重命名新文件来解决。PUSHD和POPD是可选的。。。如果适用,请使用。**未经测试**

pushd "YourFolderName"
set "FileName=YourInFileName.txt"
set "TempFile=SomeTempFileName.txt"
if exist "%TempFile% del /f /q "%TempFile%"
more "%FileName%" +1 > "%TempFile%"
del /f /q "%FileName%"
ren "%TempFile%" "%FileName%"
popd

如果您不关心保留空行,
^
,您可以通过
for
循环运行输入文件,将每一行存储在单独的变量中,然后在每一行的末尾使用换行符合并变量

@echo off
setlocal enabledelayedexpansion
cls

set counter=0
for /f "delims=" %%A in (input.txt) do (
    set line[!counter!]=%%A
    set /a counter+=1
)
set /a counter-=2

set LF=^


for /L %%A in (1,1,!counter!) do set sheet=!sheet!!line[%%A]!!LF!
set /a counter+=1
for /L %%A in (!counter!,1,!counter!) do set sheet=!sheet!!line[%%A]!
echo !sheet!>input.txt
然而如果你想保留空行和特殊字符,你可以加入一些技巧,但总体思路是一样的

@echo off
setlocal enabledelayedexpansion
cls

:: findstr /n puts line numbers at the start of each line, which will allow us to preserve blank lines
for /f "tokens=1 delims=:" %%A in ('findstr /n "^" input.txt') do set line_counter=%%A

::set /p preserves special characters
<input.txt (
    for /L %%A in (1,1,!line_counter!) do set /p line[%%A]=
)
set /a line_counter-=1

set LF=^


:: Do NOT delete the two blank lines above this line.
for /L %%A in (2,1,!line_counter!) do set sheet=!sheet!!line[%%A]!!LF!
set /a line_counter+=1
for /L %%A in (!line_counter!,1,!line_counter!) do set sheet=!sheet!!line[%%A]!

echo !sheet!>input.txt
@echo关闭
延迟扩展
cls
::findstr/n将行号放在每行的开头,这将允许我们保留空行
对于/f“tokens=1 delims=:”('findstr/n“^”input.txt)中的%%A,请设置行_计数器=%%A
::set/p保留特殊字符
输入文件

如果你不在乎保留空行,
^
,您可以通过
for
循环运行输入文件,将每一行存储在单独的变量中,然后在每一行的末尾使用换行符合并变量

@echo off
setlocal enabledelayedexpansion
cls

set counter=0
for /f "delims=" %%A in (input.txt) do (
    set line[!counter!]=%%A
    set /a counter+=1
)
set /a counter-=2

set LF=^


for /L %%A in (1,1,!counter!) do set sheet=!sheet!!line[%%A]!!LF!
set /a counter+=1
for /L %%A in (!counter!,1,!counter!) do set sheet=!sheet!!line[%%A]!
echo !sheet!>input.txt
然而如果你想保留空行和特殊字符,你可以加入一些技巧,但总体思路是一样的

@echo off
setlocal enabledelayedexpansion
cls

:: findstr /n puts line numbers at the start of each line, which will allow us to preserve blank lines
for /f "tokens=1 delims=:" %%A in ('findstr /n "^" input.txt') do set line_counter=%%A

::set /p preserves special characters
<input.txt (
    for /L %%A in (1,1,!line_counter!) do set /p line[%%A]=
)
set /a line_counter-=1

set LF=^


:: Do NOT delete the two blank lines above this line.
for /L %%A in (2,1,!line_counter!) do set sheet=!sheet!!line[%%A]!!LF!
set /a line_counter+=1
for /L %%A in (!line_counter!,1,!line_counter!) do set sheet=!sheet!!line[%%A]!

echo !sheet!>input.txt
@echo关闭
延迟扩展
cls
::findstr/n将行号放在每行的开头,这将允许我们保留空行
对于/f“tokens=1 delims=:”('findstr/n“^”input.txt)中的%%A,请设置行_计数器=%%A
::set/p保留特殊字符
输入文件

在我看来,这个问题毫无意义。无法避免将新文件内容保存在与原始文件不同的位置;即使在任何高级编程语言中也是如此,它需要从文件的第二行读取到文件的末尾,并将每一行复制到文件的开头。但是,在进程结束时,有必要截断文件,以消除文件中的最后一个字节(与第一行的字节数相同)

批处理文件当然不能执行这种类型的处理,因此文件的行(从第二行到文件末尾)必须存储在与原始文件不同的位置。其中一个答案将行存储在内存变量中,但这种方法效率低下,特别是当文件较大时

因此,如果问题是:“为了不使用新文件来消除数据文件中的第一行,可以使用哪些技巧?”,那么这是一种更有效的方法:

@echo off

for /F "skip=1 delims=" %%a in ('type input.txt ^& del input.txt') do >> input.txt echo %%a
如果要保留空行,请改用此方法:

@echo off

for /F "skip=1 tokens=1* delims=:" %%a in ('findstr /N "^" input.txt ^& del input.txt') do >> input.txt echo(%%b

您应该注意,当/F
命令开始执行时,它会阻止文件的独占访问,因此在/F
读取文件时,任何试图修改文件的行为都将避免出现“访问被拒绝”错误。

在我看来,这个问题毫无意义。无法避免将新文件内容保存在与原始文件不同的位置;即使在任何高级编程语言中也是如此,它需要从文件的第二行读取到文件的末尾,并将每一行复制到文件的开头。但是,在进程结束时,有必要截断文件,以消除文件中的最后一个字节(与第一行的字节数相同)

批处理文件当然不能执行这种类型的处理,因此文件的行(从第二行到文件末尾)必须存储在与原始文件不同的位置。其中一个答案将行存储在内存变量中,但这种方法效率低下,特别是当文件较大时

因此,如果问题是:“为了不使用新文件来消除数据文件中的第一行,可以使用哪些技巧?”,那么这是一种更有效的方法:

@echo off

for /F "skip=1 delims=" %%a in ('type input.txt ^& del input.txt') do >> input.txt echo %%a
如果要保留空行,请改用此方法:

@echo off

for /F "skip=1 tokens=1* delims=:" %%a in ('findstr /N "^" input.txt ^& del input.txt') do >> input.txt echo(%%b

您应该注意,当
for/F
命令开始执行时,它会阻止文件的独占访问,因此在
for/F
读取文件时,任何试图修改文件的行为都将避免出现“拒绝访问”错误。

是否应保留空行?文件有多长?它是否包含空白行或包含批次显示敏感字符的行?具体来说,您是否关心输出文件是否没有
s了吗?@Magoo请看编辑。哦,现在我不必保留空行或特殊字符,这将更容易。应该吗