批处理脚本 - 同时替换文件中的多个参数 [已关闭]

batch script - replace multiple arguments in a file at the same time [closed]

提问人:Arthur Bernardo 提问时间:7/28/2023 最后编辑:CompoArthur Bernardo 更新时间:7/28/2023 访问量:41

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

4个月前关闭。

要修改的文件位于多个用户 (%user%) 的每个目录中,例如:D:\Folder2\Userlist\user\config.yml

它被称为 ,看起来像这样:config.yml

#module1: [ var1 ]
#module2: [ var2 ]
#module3: [ var3 ]
#module4: [ var4 ]

我的目标是从命令行开始,能够通过在我的脚本中提出 和 替换 来激活模块,如下所示:#var

#module1: [ var1 ]
#module2: [ var2 ]
module3: [ something ]
#module4: [ var4 ]

或者通过更正#

#module1: [ var1 ]
#module2: [ var2 ]
#module3: [ something ]
#module4: [ var4 ]

我有两个文件基于一个目录,D:\Folder\Example

测试.BAT

GOTO CHOOSEACCOUNT & exit

:CHOOSEACCOUNT
set "accountpath=D:\Folder2\Userlist"
CLS
ECHO.
dir /b /s %accountpath%\*.yml
ECHO.
SET /P "user=Choose a config?"
GOTO UPDATELINKCONFIG

:UPDATELINKCONFIG
if exist "%accountpath%\%user%\config.yml" (
    set "pathuser=%accountpath%\%user%\config.yml"
    GOTO CHOOSETASK
) else (
    START cmd.exe /k "Color 4 && echo User Config don't exist ... && timeout /t 3 && exit"
    GOTO CHOOSEACCOUNT
)

:CHOOSETASK
CLS
ECHO.
ECHO path loaded: %pathuser%
ECHO account: %user%
ECHO.
TYPE %accountpath%\%user%\config-update.txt #TO PRINT ALL CHANGES
echo   +--------+
echo   ^| MENU ^|
echo   +--------+
ECHO.
ECHO   1 -  EXAMPLE1
ECHO   2 -  EXAMPLE2
ECHO   3 -  EXAMPLE3
ECHO   4 -  EXAMPLE4
ECHO   5 -  EXAMPLE5
ECHO   6 -  EXAMPLE6
ECHO   7 -  EXIT
ECHO.
ECHO.
SET /P "C4=CHOOSE AND PRESS ENTER: "
IF %C4%==1 GOTO EXAMPLE1
IF %C4%==2 GOTO EXAMPLE2
IF %C4%==3 GOTO EXAMPLE3
IF %C4%==4 GOTO EXAMPLE4
IF %C4%==5 GOTO EXAMPLE5
IF %C4%==6 GOTO EXAMPLE6
IF %C4%==7 GOTO EXIT
START cmd.exe /k "Color 4 && echo Wrong option ... && timeout /t 3 && exit"
GOTO CHOOSETASK

:EXAMPLE1
SET /P "id90=WHO IS THE USER TO PUT? (syntax: username1, username2)"
CLS
ECHO.
echo   +---------+
echo   ^| SUBMENU ^|
echo   +---------+
ECHO.
ECHO   1 -  MODULE1
ECHO   2 -  MODULE2
ECHO   3 -  MODULE3
ECHO   4 -  MODULE4
ECHO   5 -  GO BACK
ECHO.
ECHO.
SET /P "C5=CHOOSE AND PRESS ENTER: "
IF %C5%==1 set "search=var1" && set "replace=%id90%" && set "module=module1" && GOTO ACTIVATEDESA
IF %C5%==2 set "search=var2" && set "replace=%id90%" && set "module=module2" && GOTO ACTIVATEDESA
IF %C5%==3 set "search=var3" && set "replace=%id90%" && set "module=module3" && GOTO ACTIVATEDESA
IF %C5%==4 set "search=var4" && set "replace=%id90%" && set "module=module4" && GOTO ACTIVATEDESA
IF %C5%==5 GOTO CHOOSETASK
CLS
START cmd.exe /k "Color 4 && echo Wrong option ... && timeout /t 3 && exit"
GOTO CHOOSETASK

:ACTIVATEDESA
CLS
set "moduleactivation=%module%"
set "moduledesactivation=#%module%"
ECHO.
ECHO   1 -  Activate
ECHO   2 -  Desactivate
ECHO.
ECHO.
SET /P "C11=CHOOSE AND PRESS ENTER: "
IF %C11%==1 GOTO ACTIVATEMODULE
IF %C11%==2 GOTO DESACTIVATEMODULE
CLS
START cmd.exe /k "Color 4 && echo Wrong option ... && timeout /t 3 && exit"
GOTO CHOOSETASK

:ACTIVATEMODULE
set s1=%moduledesactivation%
set r1=%moduleactivation%
START cmd.exe /k "D:\Folder\Example\update.bat && timeout /t 3 && exit"
(
echo The option %module% has been activated ^!
)>>"%accountpath%\%user%\config-update.txt"
timeout /t 2
set s1=%search%
set r1=%replace%
START cmd.exe /k "D:\Folder\Example\update.bat && timeout /t 3 && exit"
(
echo The module %module% parameter has been updated of %search% to %replace% ^!
)>>"%accountpath%\%user%\config-update.txt"
GOTO CHOOSETASK

:DESACTIVATEMODULE
set s1=%moduleactivation%
set r1=%moduledesactivation%
START cmd.exe /k "D:\Folder\Example\update.bat && timeout /t 3 && exit"
(
echo The option %module% has been desactivated ^!
)>>"%accountpath%\%global%\config-update.txt"
GOTO CHOOSETASK

:EXIT
exit

我不得不缩短代码以保持一切清晰,但有几个功能。:EXAMPLE

更新.BAT

@echo off
setlocal enableextensions disabledelayedexpansion
call: D:\Folder\Example\test.bat

for /f "delims=" %%i in ('type "%pathuser%" ^& break ^> "%pathuser%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%pathuser%" echo(!line:%s1%=%r1%!
    endlocal
    ) 

exit /b

此脚本读取 中的文件,将字符串替换为 ,并保存文件而不创建其他输出。(这使我免于删除/移动/重命名)%pathuser%%search%%replace%

一切都很正常,但是我有几个问题,

  1. 当我想激活 2 次更改时,一切正常,但是当一切正常时,我的 cmd 页面中出现错误::ACTIVATEMODULE
the system cannot find the command file name -
  1. 是否可以将文件直接集成到 ,并使用 ?我不完全理解这个概念,等等......这将允许我只有一个文件update.battest.batcall: UPDATE arg1 arg2%~1%~2

  2. 例如,当更改为某些内容时,如果我想再次重新启动更改,则它不起作用,因为不再存在。是否可以存储变量并因此更改为 .还是放一个变量,例如,代替字符串才能动态更改值?var1var1set "search=var1"set "search=%var1%"%var1%var1

字符串 文件 批处理 文件替换

评论


答: 暂无答案