【问题标题】:batch file to open txt replace text save and close批处理文件打开txt替换文本保存并关闭
【发布时间】:2017-09-23 09:28:34
【问题描述】:

我知道这个社区是为了帮助人们,我不是百分百如何要求某人做委托工作或 w/e,但我想要一系列批处理文件来将某些数字更改为每个批处理文件的特定编号。

echo off
if exist %application.yml del %application.yml
for /F "delims=" %%l in (%1) do (
    set "line=%%l"
    set "line=%line:specific text=another word%"
    echo/%line%>> %application.yml)'

我将如何设置它以将一组数字替换为设置的数字,对不起,我是个彻头彻尾的白痴。

文件本身application.yml

product: 
# Cntrl alt 1 Mini, 2 m16, 3 scar, 4 m4169, 5 akm, 6 ump,7 sks
discordUsername: 
discordPassword: 
maxCPUsUsage: 4
shutdownKey: 0x7B
reloadConfigKey: 0x79

screenResolutionX: 1920
screenResolutionY: 1080

playerEsp: true
playerEspColor: 0xFF00FF
playerEspPointSize: 1

radarEsp: true
radarEspColor: 0x0000FF
radarEspPointSize: 2

vehicleEsp: true
vehicleEspColor: 0xff0000
vehicleEspPointSize: 1
vehicleEspHotkey: 0x2D

lootEsp: true
lootEspColor: 0x00FF00
lootAirdropEspColor: 0xffffff
lootEspPointSize: 1
lootEspHotkey: 0x24

redrawTime: 0
reloadDataTime: 2000

aimEnabled: true
aimKey: 0x39
aimFOV: 95
aimFrequency: 6
aimPrecision: 1
aimSpeed: 1
bulletSpeed: 990
aimHitbox: 0

# Key list: https://msdn.microsoft.com/en-us/en-en/library/windows/desktop/dd375731(v=vs.85).aspx

所以本质上我希望替换的数字是子弹速度,它可能是以前更改等的多个数字,例如

990
870
400

如果是这些实例中的任何一个,我希望将其替换为

900

等等等等。

因此它会搜索任何可能的数字并将其更改为指定的数字并以相同的文件名保存文件。

如果我在示例中完全诚实,请提前感谢您的帮助

再次向您寻求任何建议或帮助。

【问题讨论】:

  • 此站点不适合请求调试程序员,但是如果您要发布输入文件的示例,%1 具有精确的布局和大小的指示,您可能很幸运能得到回应,这样你就不必委托别人了。顺便说一句,不要将代码和文件信息发布到评论部分,使用edit 工具将其添加到您的原始帖子中。
  • 我再次编辑了您的帖子,希望能正确格式化您新添加的.yml 文件,如果现在有错误请告诉我!您是否只想替换该文件中任何位置与 990 匹配的确切值,还是只想替换仅属于 bulletSpeed 或其他内容的匹配值。
  • 你太棒了,谢谢你的帮助:)
  • 基本上我希望制作一些批处理文件来编辑(子弹速度)或任何其他子弹速度到某些批处理文件,以便我可以将它们分配给键盘上的宏键在飞行子弹速度变化。我真的可以在基本代码之后做腿部工作:)
  • 但是是的,只是子弹速度。每个子弹速度的数字应该与 .yml 中的任何其他内容相关

标签: powershell batch-file text replace


【解决方案1】:

以下评论 .bat 脚​​本应该可以完成这项工作,尽管空行不会复制到输出文件:

@ECHO OFF
SETLOCAL EnableExtensions
rem redirect all output to a brand new file
>application.yml (
  rem parse a file (supplied file name %1 must not be equal to "application.yml")   
  for /F "usebackq delims=" %%l in ("%~1") do (
      rem parse each line
      for /F "tokens=1* delims=:" %%L in ("%%~l") do (
          if /I "%%~L"=="bulletSpeed" (
              rem modified line
              echo(%%L: 900
          ) else (
              rem original line 
              echo(%%l
          )
      )
  )
)

顺便说一句,在 原始脚本 中,您需要 Delayed Expansion 正确引用(重新)定义在带括号的代码块(如 FOR 循环体)中的变量,例如如下:

echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
if exist application.yml del application.yml
for /F "delims=" %%l in (%1) do (
    set "line=%%l"
    set "line=!line:specific text=another word!"
    echo/!line!>>application.yml
)

资源(必读):

【讨论】:

    【解决方案2】:

    正则表达式是进行此类编辑的理想选择。
    除了 findstr 的功能有限之外,批处理还缺乏 RE 支持。

    这个包装好的 powershell one liner 将在 cmd 行或批处理文件中完成这项工作。

    powershell -NoP -C "(gc application.yml) -Replace '(?<=bulletSpeed: )\d+','900'|sc application.yml"
    

    它使用lookbehind assertionbulletSpeed: 后面的任何数字替换为900。

    要将替换限制为以前的 990、870、400 之一,请使用:

    powershell -NoP -C "(gc application.yml) -Replace '(?<=bulletSpeed: )(990|870|400)','900'|sc application.yml"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2019-01-03
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      相关资源
      最近更新 更多