提取包含完整字符串分隔符的字符串

时间:2017-08-31 08:00:31

标签: windows batch-file batch-processing

我有一个小批量脚本,可以从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}} **将被提取为:
:

2 个答案:

答案 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

无论如何要使用您的解决方案(使用tokensdelims),您可以连接所有分隔的部分,请参阅here on SO how it works