我有一个rev.bat文件。文件内容是:
设置 v1=10 设置 v2=20 设置 v3=1p5 设置 v4=50 设置 v5=%v4%
我想将 v3 的值增加 1(即 1p6)。
下面的代码将值更新为 1,但这种情况不是。
@echo off
cd /d D:\
setlocal enabledelayedexpansion
::set /p "var=Buildnum "
set "file=rev.bat"
for /F "tokens=1,* delims==" %%i in ('findstr "v3= " rev.bat') do (
set "versionVar=%%~i"
set "versionVal=%%~j"
set /a sequence=%%~j+1
)
for /f "tokens=1,*delims=]" %%i in ('type "%file%" ^| find /v /n "" ^& break^>%file%') do (
set "line=%%j"
if "!line!" == "!versionVar!=!versionVal!" set line=!versionVar!=!sequence!
echo(!line!>>!file!
)
答案1
只要您有一个特定的变量,这基本上就可以做到。
PowerShell 可以在这方面做得更好。
如果希望 v5=%v4% 起作用,则需要做更多工作。使用双百分号 (v5=%%v4%%) 进行批处理检测 % 符号并传递只会起作用一次。您将在输出文件中得到 v5=%v4%,我无法检测到它,因为批处理会删除它们,我不知道如何纠正。
- 我在 = 上分割线并将它们命名为 LHS 和 RHS(左侧等)。
- 我在 LHS 上寻找 v3 作为 ID
- 如果不是 v3=xyz,则跳至步骤 #6
- 我删除前两个字符并保存它们。
- 我将其余所有数字视为数字,将其加 1。然后像这样将它们重新组合起来
Set RHS=%tmp1%%tmp2%
- 我把它们重新组合起来,就像这样
Set OutputString=%LHS%=%RHS%
- 我将变量写入临时文件。
- (当前为 echo 命令)我将 TEMP 文件写入原始文件。
- 您可能应该删除临时文件。我没这么做。
批可以做得更好,但需要付出的努力会比它值得的更多。
@echo off
Set InputFile=%~DP0\rev.bat
Set OuputFile=%~DP0\rev.tmp.bat
:: Clear our output file
del /f "%OuputFile%"
for /f "delims=" %%l in ('type %InputFile%') do call :CheckLine "%%l" "%OuputFile%"
:: Using an echo here because you need to make sure the code works for you
:: before you use it. It will clobber the original file with the new one.
echo copy /y "%OuputFile%" "%InputFile%"
goto :EOF
:: ----------------------------------------------------------
:: Function CheckLine ---------------------------------------
:: ----------------------------------------------------------
:CheckLine
Set InputLine=%~1
Set OuputFile=%~2
echo Checking value for %InputLine%
for /f "tokens=1,2 delims== " %%a in ('echo %InputLine%') do set LHS=%%a&&set RHS=%%b
if /i not "v3" == "%LHS%" goto :NoMod
Set tmp1=%RHS:~0,2%
Set tmp2=%RHS:~2%
Set /a tmp2=%tmp2% +1
Set RHS=%tmp1%%tmp2%
:NoMod
Set OutputString=%LHS%=%RHS%
echo %OutputString% >>%OuputFile%
goto :EOF
答案2
看看这是否可行,您必须将该批次拖放至另一个批次。
@echo off
setlocal enabledelayedexpansion
set File=C:\my batch\batch.bat
if not exist "%File%" exit
type "%File%" |find /i "v3=" || exit
cls
if exist "%File%.tmp" del /q "%File%.tmp"
for /f "delims=" %%a in ('type "%File%"') do (
echo %%a |find /i "v3=" 2>nul 1>nul
if not !errorlevel! EQU 0 (>>"%File%.tmp" echo %%a) else (
set Line=%%a
set Number=!Line:~5!
set /a Number+=1
set "Line=!Line:~0,5!!Number!"
>>"%File%.tmp" echo !Line!
)
)
del /q "%File%"
move "%File%.tmp" "%File%"