Batch file 使用批处理修改文件中的值

Batch file 使用批处理修改文件中的值,batch-file,Batch File,各位晚上好, 我对批处理文件一无所知,但我需要它来做点什么 让我解释一下:我想做的是打开一个.c文件并浏览这行代码 #define var ((uint32_t) 1000) 之后,我想通过用户之前输入的值更改值1000,但该值并不总是1000,每次用户输入值时,例如250000, 我想在我的.c文件中替换它,然后我需要替换250000个 #define var ((uint32_t) 250000) 一次又一次地使用另一个变量,因此我希望我的程序在定义var((uint32_t)之后替换已

各位晚上好,

我对批处理文件一无所知,但我需要它来做点什么

让我解释一下:我想做的是打开一个.c文件并浏览这行代码

#define var ((uint32_t) 1000)
之后,我想通过用户之前输入的值更改值
1000
,但该值并不总是1000,每次用户输入值时,例如
250000

我想在我的.c文件中替换它,然后我需要替换250000个

#define var ((uint32_t) 250000)
一次又一次地使用另一个变量,因此我希望我的程序在定义var((uint32_t)之后替换已有的变量,并替换为用户输入的变量。我希望您对我想做的事情有一点了解

我添加了我的程序,但它并没有真正起作用,请问你有什么想法吗

@echo off
setLocal EnableDelayedExpansion
SET "file=(C:\Users\astre\Desktop\test\fichier.c)"
SET /p NouvelVal= Entrez la fréquence que vous souhaitez entre 4Mhz et 24 MHz:
SET WordToSearch=#define HSE_VALUE((uint32_t)25000000)
SET Replacement=#define HSE_VALUE((uint32_t)%NouvelVal%)
  
for /f "tokens=* delims= " %%a in %file% do (
    set str=%%a
    set str=!str:%WordToSearch%=%Replacement%!
    echo !str!>>test2.txt
)
type test2.txt>fichier.c
del test2.txt
pause

通过批处理脚本修改文本文件并不是那么简单,特别是当它是一种格式时,即使只有一个字符被添加/更改/删除,也很容易损坏,如(C)源代码

尽管如此,我还是必须尝试使用纯批处理脚本来管理它——请参见代码中的解释性说明

主要挑战是:

  • 查找包含感兴趣字符串的行
    #define var((uint32_t)1000)
    ,该行几乎可以在任何位置包含多个空格(空格和制表符),当然关键字和数字除外
  • 提取数值并保留余数;为此,我依赖(不区分大小写)关键字
    uint32\u t
    相对于数字的位置
这就是:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u FILE=C:\Users\astre\Desktop\test\fichier.C”&rem/(输入文件的路径或名称)
设置“\u TEMP=%TEMP%\%~n0\u%RANDOM%.tmp”&rem/(临时文件的路径或名称)
rem//聚集选项卡字符:
对于/F“delims=“%%T in('forfiles/P“%~dp0.”/M“%~nx0”/C“cmd/C echo/0x09”),请设置“\u T=%%T”
rem//为搜索表达式生成空白类:
设置“\u S=[%\u T%]”和设置“\u S0=[%\u T%]*”和设置“\u S1=[%\u T%][%\u T%]*”
rem//为搜索表达式构建数字类:
设置“\u D=[0123456789]”和设置“\u D0=[0123456789]*”和设置“\u D1=[0123456789][0123456789]*”
rem//在要替换的数字之前定义表达式(单词):
设置“\u SPLIT=uint32\u t”
rem//为'findstr'生成搜索表达式:
设置“_SEARCH=^%_S0%#define%_S1%var%_S1%(_S0%(_S0%%_SPLIT%%_S0%)%%_S1%%_D1%%_S0%)%_S0%$”
rem//将输出写入临时文件:
>“%\u温度%”(
设置“标志=”
rem/*逐行读取输入文件,以当前行号为前缀,
rem so行在“for/F”中显示为非空,这将被忽略:*/
对于/F“delims=“%%L in('findstr/N“^”“%\u FILE%”)do(
设置“行=%%L”
setlocal EnableDelayedExpansion
设置“行=!行:*=!”
rem//检查当前行(不带行号前缀)是否与搜索表达式匹配:
cmd/V/C echo(^^!LINE^!|>numfindstr/R/I/C:“!”u SEARCH!”&&(
rem/*当前行匹配,因此在特定表达式(word)处将其分为两部分;
rem第二部分是保存编号以便稍后更换的部分:*/
设置“之后=!行:%\u拆分%=!”
设置“BEFORE=!LINE!|”和for/F“delims=“%%K in”(“%\u SPLIT%!AFTER!|”)do set“BEFORE=!BEFORE:%%K=!”
rem/*切换延迟扩展,以避免使用感叹号“!”;
rem这需要'setlocal`/'endlocal`对,用于定位环境;
因此rem使用'for/F'在'endlocal'屏障上传输某些值;
rem临时下划线``确保没有任何标记显示为空:*/
对于/F“tokens=1*delims=| eol=|”%%G in(“|!BEFORE!|!AFTER!|”)do(
rem//在编号处拆分第二部分:
对于/F“tokens=1*delims=0123456789 eol=0”%%I in(“!AFTER!uu”)do(
端部
设置“标志=#”
设置“之前=%%G”和设置“之后=%%H”
设置“左=%%I”和设置“右=%%J”
setlocal EnableDelayedExpansion
rem//将编号前的零件附加到第一个零件:
设置“BEFORE=!BEFORE:~1!%\u SPLIT%!LEFT:~1!”
rem//从第二部分中提取数字:
设置“NUMBER=|!AFTER!|”&设置“NUMBER=!NUMBER:%%I=!”&设置“NUMBER=!NUMBER:%%J |=!”
rem//将编号后的零件存储为新的第二个零件:
设置“AFTER=!RIGHT:~,-1!”
)
)
rem//提示用户输入新号码(默认保留旧号码):
设置“ENTRY=!NUMBER!”&>con set/P ENTRY=“NUMBER(!ENTRY!):”&&(
rem//验证输入是否为纯数字(忽略空格):
设置“条目=!条目:=!”&设置“条目=!条目:%\u T%=!”
(对于/F“delims=0123456789 eol=0”%%K in(“!ENTRY!”)do rem/)&&&&>&2(
回显号条目不是纯数字;保留以前的值!Number!。
)| |设置“NUMBER=!ENTRY!”
)
rem//交换号码的返回行:
回声(!之前!!数字!!之后!
) || (
rem//当前行与搜索表达式不匹配,因此返回未编辑的行:
回音(!行::=!
)
端部
)
)
rem//将临时文件移到输入文件上,但仅当找到搜索表达式时:
如果定义了标志(
>nul move/Y“%\u TEMP%”“%\u文件%”
)else del“%\u TEMP%”
端部
退出/B
Windows命令提示符中有一些限制:

  • 输入文本文件必须是ASCII/ANSI编码;即使正确读取了Unicode文件,输出文件也会将编码更改为ASCII/ANSI;如果您可以接受,请