gpt4 book ai didi

batch-file - 使用 for/f with if 语句和变量查找和替换字符串

转载 作者:行者123 更新时间:2023-12-03 16:42:16 25 4
gpt4 key购买 nike

我写了一个批处理文件,我想用另一个 .txt 文件中的字符串覆盖关键字符串。
目前它完美地复制了新的 File.txt 文件,但不会用 OldFile.txt 文件中的字符串替换字符串。
File.txt 文件中的字符串示例:

...

# Password
Pword=

# AccountName
Account=

# TownName
Town=

# Postcode
Postcode=

# LocationChangedDate
LocationChanged=


我想替换的 OldFile.txt 文件中的字符串示例:

...

# Password
Pword=ABC

# AccountName
Account=123

# TownName
Town=LDN

# Postcode
Postcode=WS77TP

# LocationChangedDate
LocationChanged=01/01/2015


有人可以指出我正确的方向或解释我在哪里犯了错误吗?
@echo off

setlocal disableDelayedExpansion

::Variables
set InputFile=F:\EXCHANGE\3\Machine\File.txt
set OutputFile=F:\EXCHANGE\3\File-New.txt
set CopyFile=F:\EXCHANGE\3\OldMachine\OldFile.txt

set _strFindPword=Pword=.*
for /F "delims=" %%A in ('findstr /x "Pword=.*" %CopyFile%') do set _strInsertPword=%%A

echo.%_strInsertPword%

set _strFindAccount=Account=.*
for /F "delims=" %%B in ('findstr /x "Account=.*" %CopyFile%') do set _strInsertAccount=%%B

echo.%_strInsertAccount%

set _strFindTown=Town=.*
for /F "delims=" %%C in ('findstr /x "Town=.*" %CopyFile%') do set _strInsertTown=%%C

echo.%_strInsertTown%

set _strFindLocationChanged=LocationChanged=.*
for /F "delims=" %%D in ('findstr /x "LocationChanged=.*" %CopyFile%') do set _strInsertLocationChanged=%%D

echo.%_strInsertLocationChanged%

set _strFindPostcode=Postcode=.*
for /F "delims=" %%E in ('findstr /x "Postcode=.*" %CopyFile%') do set _strInsertPostcode=%%E

echo.%_strInsertPostcode%


(
for /F "delims=" %%L in ('findstr /n "^" "%InputFile%"') do (
set "line=%%L"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
if "%%L" equ "_strFindPword" (echo.!_strInsertPword!) else (
if "%%L" equ "%_strFindAccount%" (echo.!_strInsertAccount!) else (
if "%%L" equ "%_strFindTown%" (echo.!_strInsertTown!) else (
if "%%L" equ "%_strFindLocationChanged%" (echo.!_strInsertLocationChanged!) else (
if "%%L" equ "%_strFindPostcode%" (echo.!_strInsertPostcode!) else (echo.!line!)
)
)
)
)
endlocal
)
) > "%OutputFile%"

del %InputFile%

ren %OutputFile% File.txt



pause

最佳答案

我想我终于明白了...

它能做什么:

  • 它遍历 OldFile.txt 内容,搜索标记,如果发现它们被存储到环境变量中以在嵌套步骤中使用(例如对于 _PWD 标记(变量),其值为 Pword= ,它将创建一个 _PWDCONTENTS 变量,内容为 Pword=ABC )。
  • 它遍历 File.txt 内容,搜索相同的标记,如果找到一个标记,则对应的 CONTENTS变量转储在 OutFile.txt 中,否则为原始行。因为这发生在内部 for循环,我不得不添加一些额外的逻辑(_WROTE var)以避免多次编写相同的行。

  • 笔记:
  • 它应该(好吧,除了做它应该做的事情之外)是“可配置的”(代码很复杂,如果你愿意的话,它正在走向元:),这意味着如果标记之间有变化,代码不应该改变(好吧,代码会发生变化,但不会仅在变量定义中发生在功能部分)。详细说一下:
  • 如果您不再需要更换 Town=字符串,那么您所要做的就是删除 _TOWN来自 _ALL :set _ALL=_PWD _ACCT _POST _LOC .
  • 反过来:如果你想添加一些其他标签(我们称之为 Name),你必须创建一个新的环境变量:set _NAME=Name=并将其添加到 _ALL :set _ALL=_PWD _ACCT _TOWN _POST _LOC _NAME .
  • 作为一个间接的结果,我没有关注性能,所以它可能运行缓慢。无论如何,我试图将磁盘访问(这非常缓慢)保持在最低限度(一个例子是当有 2 for 循环对文件内容进行迭代的时候 - 假设每次迭代都进行磁盘访问;这可能不是是的,并且 Win 具有 IO 缓冲 - 这是外部缓冲)。
  • 我“注释”了文件中的最后一行,以避免覆盖原始文件。如果需要该行为,只需删除 rem一开始。

  • 这是批处理代码:
    @echo off
    setlocal enabledelayedexpansion

    set _INFILE="File.txt"
    set _OUTFILE="NewFile.txt"
    set _OLDFILE="OldFile.txt"


    set _PWD=Pword=
    set _ACCT=Account=
    set _TOWN=Town=
    set _POST=Postcode=
    set _LOC=LocationChanged=
    set _ALL=_PWD _ACCT _TOWN _POST _LOC

    echo Parsing old file contents...

    for /f "tokens=*" %%f in ('type !_OLDFILE!') do (
    for %%g in (!_ALL!) do (
    echo %%f | findstr /b /c:!%%g! 1>nul
    if "!errorlevel!" equ "0" (
    set %%gCONTENTS=%%f
    )
    )
    )

    copy nul %_OUTFILE%
    echo Merging the old file contents into the new file...
    set _WROTE=0

    for /f "tokens=*" %%f in ('findstr /n "^^" !_INFILE!') do (
    set _TMPVAR0=%%f
    set _TMPVAR0=!_TMPVAR0:*:=!
    for %%g in (!_ALL!) do (
    echo !_TMPVAR0! | findstr /b /c:!%%g! 1>nul
    if "!errorlevel!" equ "0" (
    echo.!%%gCONTENTS!>>!_OUTFILE!
    set _WROTE=1
    )
    )
    if "!_WROTE!" equ "0" (
    echo.!_TMPVAR0!>>!_OUTFILE!
    ) else (
    set _WROTE=0
    )
    )

    rem copy /-y %_OUTFILE% %_INFILE%

    @EDIT0 :使用@StevoStephenson 建议(作为问题片段的一部分),我替换了(第二个)外部 for循环到 ('findstr /n "^^" !_INFILE!')为了包括空行,所以第三条评论不再适用(删除)。还做了一些小的更改以允许在其路径中包含 SPACE 的文件。

    关于batch-file - 使用 for/f with if 语句和变量查找和替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469919/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com