我有一个小批量脚本,可以从mysql.err
文件中获取临时密码。
但是,如果密码包含:
用于分隔符匹配,则会出现问题,导致密码无法按原样获取..
是否有其他方法可以正确获取密码?
@echo off
setlocal enableextensions enabledelayedexpansion
set mysql_dir=C:\database\mysql
echo.
echo.
echo Search For Current MySQL Password
FOR /F "tokens=4 delims=:" %%G in ('find /I "A temporary password is generated for root@localhost:" ^<%mysql_dir%\data\%ComputerName%.err') DO set temp_mysql_password="%%G"
echo.
echo.
echo Current MySQL password: %temp_mysql_password%
mysql.err
文件内容为:
2017-08-31T07:38:36.195916Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-08-31T07:38:36.205943Z 22 [Note] A temporary password is generated for root@localhost: v>dqu;;&)7:Y
2017-08-31T07:38:42.510215Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
问题在于密码
包含v>dqu;;&)7:Y
的{{1}} **将被提取为:
:
。
答案 0 :(得分:2)
如果你使用了“tokens = 3 * delims =:”而下一个变量%% H你将获得未解析的密码。
星号表示输入的其余部分,而不进一步在delims进行拆分。
@ConditionalOnProperty
答案 1 :(得分:1)
这种没有分隔符的方式可以起作用:
...
for /F "delims=" %%G in ('find /I "A temporary password is generated for" ^<%mysql_dir%\data\%ComputerName%.err') do (
set "temp_mysql_password=%%G"
set "temp_mysql_password=!temp_mysql_password:*A temporary password is generated for root@localhost: =!"
)
echo.
echo.
rem Note the ! around the variable
echo Current MySQL password: !temp_mysql_password!
它使用字符串操作,解释为here: Remove - Remove a substring using string substitution。
请注意,它只适用于root@localhost
,因为该字符串是搜索替换字符串的一部分。
要使其适用于任何user@host
组合,您必须使用3个字符串替换而不是一个:
set "temp_mysql_password=!temp_mysql_password:*A temporary password is generated for =!"
set "temp_mysql_password=!temp_mysql_password:*@=!"
set "temp_mysql_password=!temp_mysql_password:*: =!"
<强>输出:强>
Current MySQL password: v>dqu;;&)7:Y
无论如何要使用您的解决方案(使用tokens
和delims
),您可以连接所有分隔的部分,请参阅here on SO how it works。