Как искать и заменять строки, содержащие символы «=» в текстовом файле, на Windows CMD (не powershell) - PullRequest
0 голосов
/ 23 октября 2018

Я написал этот код на основе некоторых других примеров, но просто не могу заставить его работать?(это файл .bat)?Код записывает новый файл со всеми старыми строками, просто не будет редактировать три строки прямо с символом «=».Может кто-нибудь указать мне правильное направление, пожалуйста.

Вот как выглядит файл INTOUCH.INI:

[InTouch]  
AppMode=2  
AppName0=test  
AppName1=  
AppName2=  
AppName3=  
AppDesc0=New InTouch application  
AppDesc1=  
AppDesc2=  
AppDesc3=  
SAOConverted=1  
WinFullScreen=1  
WinLeft=-4  
WinTop=-4  
WinWidth=1032  
WinHeight=748  
UseNewSendKeys=1  
DebugScripts=0  
UseBigBitmap=1  
WindowViewerStartupIconic=0  
CloseOnTransfer=0

И вот что написано:

[InTouch]  
AppMode=2  
AppName0=test  
AppName1=  
AppName2=  
AppName3=  
AppDesc0=New InTouch application  
AppDesc1=  
AppDesc2=  
AppDesc3=  
SAOConverted=1  
1=WinFullScreen=0=1  
WinLeft=-4  
WinTop=-4  
1032=WinWidth=1000=1032  
748=WinHeight=700=748  
UseNewSendKeys=1  
DebugScripts=0  
UseBigBitmap=1  
WindowViewerStartupIconic=0  
CloseOnTransfer=0 

Это мой файл .batкод:

Set "OldString1=WinFullScreen=1"
Set "NewString1=WinFullScreen=0"
Set "OldString2=WinWidth=1032"
Set "NewString2=WinWidth=1000"
Set "OldString3=WinHeight=748"
Set "NewString3=WinHeight=700"

@ECHO OFF &SETLOCAL
cd /d F:\
for %%x in (INTOUCH.INI) do call:process "%%~x"
goto:eof

:process 
set "outFile=%~n1_edited%~x1" 
(for /f "skip=2 delims=:" %%a in ('find /n /v "" "INTOUCH.INI"') do (
      set "ln=%%a"
      Setlocal enableDelayedExpansion 
      set "ln=!ln:*]=!"
      if defined ln (
           set "ln=!ln:%OldString1%=%NewString1%!"
           set "ln=!ln:%OldString2%=%NewString2%!"
           set "ln=!ln:%OldString3%=%NewString3%!"
           )
      echo(!ln!
      endlocal
))>"%outFile%"
Exit /b

Ответы [ 2 ]

0 голосов
/ 23 октября 2018
@echo off

Set "AppMode=x"
Set "WinFullScreen=0"
Set "WinWidth=1000"
Set "WinHeight=700"

for /f "skip=1 usebackq tokens=1,2 delims==" %%G in ("a.INI") do call :proc "%%G" %%H

exit /b

:proc
set val=%2
for /F "tokens=* eol= " %%S in ("%~1") do set trimmed=%%S
call :getoverrideval %trimmed%
if "%override%" == "" (
  echo %~1=%2%
) else (
  echo %~1=%override%
)
goto :EOF

:getoverrideval
call set override=%%%1%%

Выход:

C:\Users\w16coreeval>cmd /c a.bat
 AppMode=x
 AppName0=test
 AppName1=
 AppName2=
 AppName3=
 AppDesc0=New
 AppDesc1=
 AppDesc2=
 AppDesc3=
 SAOConverted=1
 WinFullScreen=0
 WinLeft=-4
 WinTop=-4
 WinWidth=1000
 WinHeight=700
 UseNewSendKeys=1
 DebugScripts=0
 UseBigBitmap=1
 WindowViewerStartupIconic=0
 CloseOnTransfer=0
0 голосов
/ 23 октября 2018

Если вы используете формат файла в своих интересах, вы можете установить значения новых переменных в верхней части скрипта, а затем, читая имена переменных из файла настроек, сможете увидеть, определены ли эти переменные.Если они определены, выведите новое значение, в противном случае выведите исходное значение.

Хитрость в этом заключается в расширении двойной переменной, которое вы получаете, когда вы используете команды CALL и ECHO вместе.Сначала для переменной for раскрывается имя переменной, а затем на втором этапе расширения значение переменной затем расширяется.Вот причина дополнительных наборов символов процента.

@echo off
Set "WinFullScreen=0"
Set "WinWidth=1000"
Set "WinHeight=700"

REM cd /d F:\

for %%F in (INTOUCH.INI) do set "outFile=%%~nF_edited%%~xF"

REM Read first line of file
set /p line1=<INTOUCH.INI
(echo %line1%
for /f "usebackq skip=1 tokens=1,2 delims==" %%G in ("INTOUCH.INI") do (
    if defined %%G (
        CALL echo %%G=%%%%G%%
    ) else (
        echo %%G=%%H
    )
))>"%outFile%"
Exit /b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...