Windows Пакет - Найти строку и заменить текст - PullRequest
0 голосов
/ 24 февраля 2020

, вероятно, на Inte уже ответили 1015 *, но я не могу найти решение.

У меня есть файл .ini, который содержит много текста, вот пример:

[General]
FullScreen = True
InternalResolution = 0

Мне нужно настроить пакетный файл, который ищет эту строку InternalResolution и изменяет значение на другое число, например 5. Вывод должен выглядеть следующим образом:

[General]
FullScreen = True
InternalResolution = 5

У меня есть две проблемы, во-первых, значение = 0 иногда может быть = 1 или = 2, а также что все пробелы должны существовать в файле (приложение зависит от этого INI-файла, поэтому я не могу удалить пробелы. Я попробовал это:

@echo off
setlocal disableDelayedExpansion

:Variables
set InputFile=myfile.ini
set OutputFile=myfiletemp.ini
set "_strFind=InternalResolution = 0"
set "_strInsert=InternalResolution = 5"

:Replace
>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo %_strInsert%) else (echo %%A)
  )
)

DEL %InputFile%
MOVE %OutputFile% %InputFile%


ENDLOCAL

Это работает, только если значение InternalResolution равно 0. Я не знаю, как заменить строку, если значение отличается от 0. Должен быть способ найти, содержит ли строка текст InternalResolution = X, и заменить всю строку или значение.

Спасибо.

Ответы [ 4 ]

1 голос
/ 24 февраля 2020

Вы можете использовать подстроку подстановки , как показано ниже:

:Replace
> "%OutputFile%" (
    for /F "usebackq delims=" %%A in ("%InputFile%") do (
        set "line=%%A"
        setlocal EnableDelayedExpansion
        if "!line!" equ "%_strFind%!line:*%_strFind%=!" (
            echo(!_strInsert!
        ) else (
            echo(%%A
        )
        endlocal
    )
)
1 голос
/ 24 февраля 2020

FIND хороший вариант. Более простой способ - разделить его на два токена %%A %%B и просто проверить, равен ли %%A %_strFind% (я также изменил его).

@echo off

:Variables
set InputFile=myfile.ini
set OutputFile=myfiletemp.ini
set "_strFind=InternalResolution"
set "_strInsert=InternalResolution = 5"

:Replace
>%OutputFile% (
  for /f "usebackq tokens=1* delims= " %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo %_strInsert%) else (echo %%A %%B)
  )
)

MOVE /Y %OutputFile% %InputFile%

Проверено на Windows 10 ноутбуков.
ПРИМЕЧАНИЕ. Может не справиться с ядовитыми персонажами

0 голосов
/ 27 февраля 2020

Windows 10 64-бит

Найти и заменить текст командами FOR и IF команды cmd

Заменяет:

InternalResolution = 0
InternalResolution      = 1
InternalResolution =      2
InternalResolution =      abc

На:

InternalResolution = whatever value you want

InternalResolution= whatever не заменяется.

@echo off
setlocal enableextensions
set InputFile=myfile.ini
set FindStr=InternalResolution
copy /y %InputFile% %InputFile%.bak
(for /f "usebackq tokens=1*" %%g in ("%InputFile%") do if "%%g" equ "%FindStr%" (echo %%g = 5) else (echo %%g %%h))> %temp%\# 
MOVE /Y %temp%\# %InputFile% 
0 голосов
/ 24 февраля 2020

Windows 10 64-бит. PowerShell 5.1

Замените текст на PowerShell 5.1, используя get-content и регулярное выражение.

До и после знака равенства должен быть ровно один пробел.

InternalResolution = 0-9 заменяется на InternalResolution = 5

(Get-Content "myfile.ini") -replace "InternalResolution = \d", "InternalResolution = 5" | Set-Content "myfiletemp.ini"

См. , как заменить текст на powershell, get-content, -replace и regex

Regex

...