Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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 File - Fatal编程技术网

Batch file 在文本文件中查找特定行并使用批处理文件进行更新

Batch file 在文本文件中查找特定行并使用批处理文件进行更新,batch-file,Batch File,我正在尝试创建一个bat文件,我可以将一个参数传递给它,它将被写入文件中非常特定位置的文本文件中。文件中的位置从一开始就是未知的,但可以使用硬编码值找到它 文本文件的结构: SECTION1 value1 = 123456 value2 = asdf value3 = 1111 SECTION2 value1 = 654321 value2 = something value3 = 875 SECTION3 value1 = 92948 value2 = aaaaaaa value3 = 649

我正在尝试创建一个bat文件,我可以将一个参数传递给它,它将被写入文件中非常特定位置的文本文件中。文件中的位置从一开始就是未知的,但可以使用硬编码值找到它

文本文件的结构:

SECTION1
value1 = 123456
value2 = asdf
value3 = 1111
SECTION2
value1 = 654321
value2 = something
value3 = 875
SECTION3
value1 = 92948
value2 = aaaaaaa
value3 = 6499
目标是以以下方式调用批处理文件:

batch.bat somethingelse
。。。然后让它准确地更新,只更新第2节,值2,从“某物”到“某物”。就像我写的,我非常乐意在批处理文件中硬编码“SECTION2”和“value2”

这就是我目前所拥有的。不多。我的方法是分三步进行的,但也许这是错误的观点:

1:确定第2节从何处开始:

for /f "delims=:" %%N in ('findstr /n "SECTION2" "file.txt"') do set section=%%N
echo %section%
2:从%section%的开始,找到value2的第一个匹配项并存储该行号:

Not sure how to accomplish this.
3:在最后一行编号处,用“value2=“+somethingelse”覆盖它,即第一个参数:

This gives me what the row should look like, but I'm not sure how to actually write it.
set output=value2 = %1
echo %output%

使用脚本语言,利用功能齐全的正则表达式(如PowerShell)来实现这一点要容易得多,因为它是windows的一部分,因为版本7(-raw参数需要PSv3+)

关于本主题,PowerShell一号衬里分批包装:

powershell -NoP -C "(gc .\file.txt -raw) -replace '(?SM)(?<=SECTION2.*?value2 = ).*?$(?=.*?^[^=]+$)','somethingelse'|Set-Content .\file.txt"

有几种不同的方法可以通过批处理文件解决此问题。这一个使用完全相同的逻辑,非常简单:

@echo off
setlocal

rem 1: Identify where SECTION2 starts:
for /f "delims=:" %%N in ('findstr /n "SECTION2" "file.txt"') do set "section=%%N"

rem 2: From the start of %section% find the first occurrence of value2 and store that row number:
set "firstRow="
for /f "delims=:" %%N in ('findstr /n "value2" "file.txt"') do (
   if %%N gtr %section% if not defined firstRow set "firstRow=%%N"
)

rem 3: At the final row number, overwrite it with "value2 = " + somethingelse, i.e. the first parameter:
(for /F "tokens=1* delims=:" %%N in ('findstr /n "^" "file.txt"') do (
   if %%N neq %firstRow% (
      echo %%O
   ) else (
      echo value2 = %1
   )
)) > newFile.txt

rem Final step: update the new file
move /Y newFile.txt file.txt

谢谢你的建议!我可以想象你可以用PS做很多强大的事情。虽然这里有一个问题,我没有指定它,但是第3节的名称未知,无法在脚本中硬编码,所以我认为这不起作用。假设未知的下一节是一行不包含等号,我更改了正则表达式,现在应该可以了。遗憾的是,有些值由多行组成。但是,每个节的格式如下:[[SECTIONx]],因此要查找以“[[”开头的行应该可以工作!这很好!但是,我仍然有一个bug。我没有指定它,但是文件包含一些空白行,并且那些被文本
ECHO替换的行是关闭的。
因此在这里。有什么办法吗?用
ECHO替换行
ECHO
(%O
成功了!谢谢。这使此解决方案实际上可以正常运行,但我很好奇正则表达式方法是否也能起作用。:)好吧,您可以选择这一个作为最佳答案(勾选绿色复选标记)。您也可以稍后在有足够代表的情况下进行投票。。。
@echo off
setlocal

rem 1: Identify where SECTION2 starts:
for /f "delims=:" %%N in ('findstr /n "SECTION2" "file.txt"') do set "section=%%N"

rem 2: From the start of %section% find the first occurrence of value2 and store that row number:
set "firstRow="
for /f "delims=:" %%N in ('findstr /n "value2" "file.txt"') do (
   if %%N gtr %section% if not defined firstRow set "firstRow=%%N"
)

rem 3: At the final row number, overwrite it with "value2 = " + somethingelse, i.e. the first parameter:
(for /F "tokens=1* delims=:" %%N in ('findstr /n "^" "file.txt"') do (
   if %%N neq %firstRow% (
      echo %%O
   ) else (
      echo value2 = %1
   )
)) > newFile.txt

rem Final step: update the new file
move /Y newFile.txt file.txt