Batch file 批处理脚本,用于向文件中添加一行文本

Batch file 批处理脚本,用于向文件中添加一行文本,batch-file,Batch File,我是一个新手,在这里找到了一些关于如何制作一个脚本,将文本行写入文件的信息。结果似乎很好(也适用于多个文件),除了文本在底部结束,我需要它在顶部 @echo off set "$New_line=TEXT" for /r "C:\" %%A in (*.txt) do >"%%A" echo %$New_line% @ECHO关闭 SETLOCAL rem源目录、目标目录、目标目录的以下设置, rem批处理目录、文件名、输出文

我是一个新手,在这里找到了一些关于如何制作一个脚本,将文本行写入文件的信息。结果似乎很好(也适用于多个文件),除了文本在底部结束,我需要它在顶部

@echo off
set "$New_line=TEXT"

for /r "C:\" %%A in (*.txt) do >"%%A" echo %$New_line%
@ECHO关闭
SETLOCAL
rem源目录、目标目录、目标目录的以下设置,
rem批处理目录、文件名、输出文件名和临时文件名[如果显示]是名称
我用于测试的rem,故意包含包含空格的名称,以确保
rem确认流程使用这些名称工作。这些将需要改变,以适应您的情况。
设置“sourcedir=u:\your files”
设置“$New\u line=TEXT”
::在子树中根本不存在且不以“.txt”结尾的文件名
设置“dummyfilename=#@QQYHNGQVXJR.#$#”
对于/F“delims=“%%b IN('dir/b/s/a-d”%sourcedir%\*.txt“)DO(
设置“skipme=”
对于/F“delims=:”%%c IN('FINDSTR/n/L/c:“%$new_line%”“%%b”),如果“%%c”eq“1”设置为“skipme=Y”,则执行该操作
如果未定义,请使用skipme(
>“%%~dpb%dummyfilename%”ECHO%$new\u line%
键入“%%b”>>“%%~dpb%dummyfilename%”
移动/y“%%~dpb%dummyfilename%”“%%%b”>NUL
)
)
后藤:EOF
我真的不相信您会想在
c:
驱动器上的每个
.txt
文件中预先添加文本。您应该设置“sourcedir”以在小样本子树上开始处理

findstr
处理查找
%$new\u line%
作为外部
循环选择的每个文件的第一行,并设置
skipme
(如果找到该条件)。这样,将跳过已处理文件的处理


关于:在添加的行中使用右括号:

如果要插入的行中有闭合圆括号,则需要使用插入符号“转义”
,因此:
设置“$New\u line=@Firm\u Begin(16368^)”

原因是批处理将把转义的-)呈现为

并将
^)
识别为转义-)因此将
视为任何常规文本字符

如果没有转义字符,batch将命令解释为

 IF NOT DEFINED skipme (
  >"%%~dpb%dummyfilename%" ECHO @Firm_Begin(16368)

  TYPE "%%b">>"%%~dpb%dummyfilename%"
  MOVE /y "%%~dpb%dummyfilename%" "%%b" >NUL
 )
这有两个后果

对于未定义
skipme
的文件,
@Firm_Begin(16368
作为第一行也是唯一一行发送到虚拟文件,然后添加整个文件的文本,幸运的是,结果是将
移动到原始文件上,使虚拟文件不存在

但是,在定义了
skipme
的文件中,只跳过
…ECHO%$new\u line%
。然后将原始文件键入不存在的虚拟文件,然后dummy文件覆盖原始文件-因此不会造成任何损坏

…还是有

findstr…C:“%$new_line%”
通过标志
skipme
来区分是否选择要添加前言的文件。不幸的是,
$new_line
的值现在包含
^
,在本例中,
^
不会转义
,因为
/C:“表达式”
被引用(因为字符串值包含空格,所以必须如此),所以它的内容按字面意思理解
findstring
将搜索文本字符串
@Firm\u Begin(16368^)
,而不是
@Firm\u Begin(16368)

解决方法是从
$new\u行
中删除任何
^
,因此

...'FINDSTR /n /L /C:"%$new_line:^=%" "%%b"'...
并添加
/x
开关作为细化,以便字符串必须匹配整行,因此

这应该可以解决问题

但是还有清理,可以使用
\x
来检测第一行是
@Firm\u Begin(16368
而不是
@Firm\u Begin(16368)
的文件

[这部分我还没有测试,不幸的是没有时间测试atm]

 FOR /F "delims=:" %%c IN ('FINDSTR /n /x /L /c:"%$new_line:~0,-3" "%%b"') DO IF "%%c" equ "1" echo incorrect headline in "%%b"

应指示出现该情况的文件。对于检测到的任何此类文件,需要做的只是使用正确的顶行初始化虚拟文件,然后对/f“usebackqskip=1delims=“%%L in”(%%b)”使用
>>“%dummyfile%”执行echo%%L
将文件的内容
%%b
,除了第一行以外的所有内容都附加到虚拟文件。

您没有附加。您正在使用的当前代码正在被覆盖。一个
覆盖,两个
附加。如果您要进行预附加,则需要创建一个全新的文件并将新行回送到虚拟文件首先t file,然后在迭代文件上使用type命令进入新文件。另一个选项是在文件中包含新行,然后使用
COPY
命令将它们合并到一个新文件中。一个后续问题。对于我使用的新行:set“$new_line=@Firm_Begin(16368)”。在结果中“)”缺失。它工作正常!泰。我花了一些时间来理解。尚未测试清理部分,但如果我理解正确,它适用于没有“?”的文件。是-检测那些将
@Firm\u Begin(16368
作为第一行的文件,而不是
@Firm\u Begin(16368)
。我想我可以用它作为替换一些tex的开始,但结果太复杂了。然后我尝试了一种简单的方法,但当我想要查找和替换的文本有引号时,结果很短:“import fra susoft”“1”“31”。至于替换多个文件,我甚至没有尝试过。
@ECHO Off SETLOCAL set vSearch=“text a”&set vReplace=“Text B”setlocal enableextensions disabledelayedexpansion set“vtextFile=D:\tmp\batch\VISMA_300.txt”for/f“delims=“%%i in('type”%vtextFile%“^&break^>“%vtextFile%”)do(set“line=%%i”setlocal enabledelayedexpansion>“%vtextFile%”回显(!line:%vSearch%=%vReplace%!endlocal)
FOR /F "delims=" %%b IN ('dir /b /s/a-d "%sourcedir%\*.txt"') DO (
 SET "skipme="
 FOR /F "delims=:" %%c IN ('FINDSTR /n /x /L /c:"%$new_line:^=%" "%%b"') DO IF "%%c" equ "1" SET "skipme=Y"
 IF NOT DEFINED skipme (
  >"%%~dpb%dummyfilename%" ECHO %$new_line%
  TYPE "%%b">>"%%~dpb%dummyfilename%"
  MOVE /y "%%~dpb%dummyfilename%" "%%b" >NUL
 )
)
GOTO :EOF
 FOR /F "delims=:" %%c IN ('FINDSTR /n /x /L /c:"%$new_line:~0,-3" "%%b"') DO IF "%%c" equ "1" echo incorrect headline in "%%b"