批处理 mysql 5.7 一键重置密码(Windows)


参考:https://www.jb51.net/article/52555.htm

@echo off 
 
title mysql 
 
::从注册表找到Mysql的安装路径写入文件mysql.txt 
reg query HKLM\SYSTEM\ControlSet001\Services\MySQL | find /I "ImagePath">C:\mysql.txt 
if %errorlevel% neq 0 ( 
echo MySQL not found 
pause 
exit
) 
 
::以”为分隔符,截取第二段内容保存到变量mysqlPath 
FOR /F tokens^=2^ delims^=^" %%i in (C:\mysql.txt) do set mysqlPath=%%i 
del C:\mysql.txt /f 
 
::路径中/替换为\ 
set mysqlPath=%mysqlPath:/=\% 
 
::删除路径最后一个字符(该字符不可见,可能是回车换行之类的) 
set mysqlPath=%mysqlPath:~0,-1% 
 
:BACKTOMAIN 
 
::取得路径最后一个字符看等不等于\ 
set character=%mysqlPath:~-1,1% 
 
::如果最后一个字符不等于\,那么跳转到GETPATH删除mysqlPath的最后一个字符 
if not %character% == \ goto GETPATH 
 
::进入mysql安装路径C:\Program Files\MySQL\MySQL Server 5.0\bin 
cd /d "%mysqlPath%"
 
::echo %mysqlPath% 
 
if %errorlevel% neq 0 ( 
echo MySQL not found 
pause 
exit
) 
 
::禁用mysql服务,跳过权限验证修改密码 
taskkill /F /IM mysqld-nt.exe 
net stop mysql >nul 
start /b mysqld-nt --skip-grant-tables 
ping -n 2 127.0.0.1 >nul 
echo use mysql >c:\config.tmp 
echo update user set password=password("") where user="root";>>C:\config.tmp 
echo flush privileges; >>C:\config.tmp 
echo exit >>C:\config.tmp 
 
::因为是交互式,所以从文件读取内容 
mysql nul 
net start mysql 
del C:\config.tmp /F 
pause 
exit
 
::删除路径最后一个字符,跳回主程序 
:GETPATH 
set mysqlPath=%mysqlPath:~0,-1% 
goto BACKTOMAIN

但没有成功

下面是我们成功的脚本:

注意:是放到mysql目录下以管理人身份运行

@setlocal enabledelayedexpansion
@echo off
color f0
title 强制修改root用户密码

rem 下面为自定义参数可修改
set mysqlServiceName=MySQL7506
set iniFileName=my1.ini
set mysqlPort=3306
set newPwd=root

set basedir=%~dp0
set bin=%~dp0\bin
set timeConfig=!basedir!config.tmp
cd /d %~dp0

echo %timeConfig%

::禁用mysql服务,跳过权限验证修改密码 
net stop %mysqlServiceName% >nul
taskkill /F /IM mysqld.exe 
start /b %bin%\mysqld --defaults-file="%basedir%my.ini" --console --skip-grant-tables
mysql -u root -P%mysqlPort%
echo use mysql >%timeConfig% 
echo update user set password=password(%newPwd%) where user="root";>>%timeConfig%
echo flush privileges; >>%timeConfig% 
echo exit >>%timeConfig% 
 
::因为是交互式,所以从文件读取内容 
mysql <%timeConfig% 
taskkill /F /IM mysqld.exe 
net stop %mysqlServiceName% >nul 
net start %mysqlServiceName% 
del %timeConfig% /F 
pause 
exit