文件中连接字符串如下
config.yml
:
"DRIVER={SQL Server};SERVER=my_server;DATABASE=myDBName;UID=username;PWD=password"
还有很多其他线路。
批处理文件中定义的带有数据库登录凭据的连接字符串应由批处理文件写入文件中
config.yaml
:
"DRIVER={SQL Server};SERVER=%server_name%;DATABASE=%DBname%;UID=%user%;PWD=%password%"
文件的其余部分
config.yml
文件应保持不变。
如何实现这一目标?
Windows 命令处理器 cmd.exe
解释批处理文件是 Windows 上默认安装的用于修改文本文件中的数据的所有脚本解释器中最糟糕的选择。它是为执行命令和可执行文件而设计的。它不是为文本文件编辑目的而设计的。但是,此批处理文件代码无需使用 Windows 上默认安装的其他脚本解释器或可执行文件即可完成作业。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceName=config.yaml"
set "SourceFile=%~dp0%SourceName%"
if not exist "%SourceFile%" (
echo ERROR: File "%SourceFile%" not found.
goto EndBatch
)
rem These environment variables are defined for completness.
set "server_name=MyServerName"
set "DBname=MyDatabaseName"
set "user=MyUserName"
set "password=MyPassword"
set "TempFile=%SourceFile%.tmp"
set "LineUpdated="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" "%SourceFile%" 2^>nul') do (
set "Line=%%I"
setlocal EnableDelayedExpansion
if defined LineUpdated (
echo(!Line:*:=!
endlocal
) else (
if "!Line:;SERVER=!" == "!Line!" (
echo(!Line:*:=!
endlocal
) else (
if not "!Line:~1,-1!" == "DRIVER={SQL Server};SERVER=!server_name!;DATABASE=!DBname!;UID=!user!;PWD=!password!" (
echo "DRIVER={SQL Server};SERVER=!server_name!;DATABASE=!DBname!;UID=!user!;PWD=!password!"
endlocal
set "LineUpdated=1"
) else (
endlocal
set "LineUpdated=2"
goto ProcessResult
)
)
)
))>"%TempFile%"
:ProcessResult
if not exist "%TempFile%" (
echo ERROR: Failed to create a temporary file in the folder:
echo "%~dp0"
goto EndBatch
)
if not defined LineUpdated (
echo ERROR: Failed to find the line to update in the file:
echo "%SourceFile%"
del "%TempFile%" 2>nul
goto EndBatch
)
if %LineUpdated% == 2 (
rem The source file contains already exactly the specified data.
del "%TempFile%" 2>nul
goto EndBatch
)
del /A /F "%SourceFile%" 2>nul
ren "%TempFile%" "%SourceName%" 2>nul
if exist "%TempFile%" (
echo ERROR: Failed to overwrite the configuration file:
echo "%SourceFile%"
del "%TempFile%" 2>nul
goto EndBatch
)
:EndBatch
endlocal
此批处理文件是针对问题中发布的行编写的。要更新的行必须以 "
开头,并且必须以
"
结尾。要更新的行通过包含不区分大小写的字符串
;SERVER
来标识。因此,如果任何其他行在任何情况下也包含
;SERVER
或者要更新的行包含更多数据,则此批处理文件无法按设计工作。请阅读我的答案
如何逐行读取和打印文本文件的内容?,了解仅使用内部命令cmd.exe
和Windows系统目录中的外部Windows命令处理文本文件时要解决的主要问题. 还有
如何使用 Windows 命令行环境查找和替换文件中的文本? 有很多替代方法可以在文本文件中进行搜索和替换。我个人最喜欢的工具是JREPL.BAT。但这里没有使用这个工具,因为谁知道输入哪个字符串作为密码。例如,它可以包含 $1
,它将被解释为正则表达式,因此密码字符串不会按照批处理文件的用户定义写入文件中。通常使用以下命令行将源文件替换为临时文件:
move /Y "%TempFile%" "%SourceFile%" >nul 2>nul
但是如果源文件设置了只读属性,这一行就会出现问题。在这种情况下,尽管使用选项 /Y
来确认覆盖只读文件,命令 MOVE
仍会提示用户。由于
>nul
,此提示不可见。可以删除
>nul
以查看提示,但成功的文件移动会导致输出文本
1 file(s) moved.
,看起来不太好。因此,即使在只读属性集上,也可以使用DEL 删除源文件,如果 NTFS 权限或文件共享访问冲突未阻止,则使用 REN 将临时文件重命名为源文件的名称。 要了解所使用的命令及其工作原理,请打开
命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
... 解释
%~dp0
... 完整的批处理文件路径始终以反斜杠结尾。
del /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
rem /?
ren /?
set /?
setlocal /?