【问题标题】:Windows Batch - Find a line and replace with textWindows Batch - 查找一行并替换为文本
【发布时间】:2020-06-07 14:03:12
【问题描述】:

这可能已经在互联网上得到解答,但我找不到解决方案。

我有一个包含大量文本的 .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 并替换整行或值。

谢谢。

【问题讨论】:

  • 似乎没有内部命令可以更改本机cmd中的文件,您只能将数据附加到它或重写它(除非您在谈论psh)
  • 根据您告诉我们的内容,尝试确定每个可能的值似乎有点不必要。为什么不直接使用find.exe,看看InternalResolution = 5 是否与myfile.ini 匹配,如果不是,只需添加/替换即可。
  • /Y 开关添加到move 命令行时,您可能会跳过del 命令...

标签: windows batch-file text replace find


【解决方案1】:

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 笔记本电脑上测试。
注意:可能无法处理有毒字符

【讨论】:

  • 我会将=-符号添加到分隔符列表中,因为周围的空格可能是可选的...
  • @asc 我尝试了一个小时将等号作为分隔符并解决了这个问题。 stackoverflow.com/a/60423960/8826818
  • 我的意思是使用for /F选项字符串"usebackq tokens=1* delims== ";但随后echo %%A %%B 需要替换为echo %%A = %%B...
  • @asc 我这样做了,但在[General]Full Screen = True 上失败了。一般变为[General]=,全屏变为Full Screen True。谢谢。
【解决方案2】:

Windows 10 64 位。 PowerShell 5.1

使用 get-content 和正则表达式将文本替换为 PowerShell 5.1。

等号前后必须有一个空格。

InternalResolution = 0-9 替换为InternalResolution = 5

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

how to replace text with powershell, get-content,-replace, and regex

正则表达式

【讨论】:

  • 没有表达使用 cmd 的愿望。没有使用 cmd 标签。
  • 谢谢你们! HackingAddict0302 的方法效果很好。
【解决方案3】:

您可以使用sub-string substitution,如下所示:

: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
    )
)

【讨论】:

    【解决方案4】:

    Windows 10 64 位

    用 cmd 的 FOR 和 IF 命令查找和替换文本

    替换:

    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% 
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2018-09-07
      • 2011-09-19
      相关资源
      最近更新 更多