@echo off
set dumpfile=mysqldump-10.52.35.230-all.sql
title %dumpfile%
mysqldump --version
mysqldump --force --set-gtid-purged=OFF --default-character-set=utf8mb4 -h10.52.35.230 -uadm -p --all-databases --triggers --routines --events --single-transaction > %dumpfile%
pause
function Read-Input([string]$prompt, [string]$default) {
    Write-Host "$prompt [$default]:" -NoNewline
    $input = Read-Host
    if ([string]::IsNullOrWhiteSpace($input)) {
        return $default
    } else {
        return $input
    }
}

function Read-Password() {
    $passSecure = Read-Host "请输入密码" -AsSecureString
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passSecure)
    $plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    return $plainPassword
}

# 主程序开始

$mysqlHost = Read-Input "请输入MySQL主机" "10.52.35.230"
$mysqlPort = Read-Input "请输入MySQL端口" "3306"
$mysqlUser = Read-Input "请输入用户名" "adm"
$mysqlPass = Read-Password
$mysqlParams = @(
    "-h", $mysqlHost,
    "-P", $mysqlPort,
    "-u", $mysqlUser,
    "--password=$mysqlPass"
)
$mysqldumpOptions = @(
    "--force",
    "--set-gtid-purged=OFF",
    "--default-character-set=utf8mb4",
    "--triggers",
    "--routines",
    "--events",
    "--single-transaction"
)
# 获取数据库列表
try {
    $databases = & ./mysql @mysqlParams --password="$mysqlPass" -N -e "SHOW DATABASES;" 2>$null
    if (-not $databases) {
        Write-Host "连接失败或未获取到数据库列表,请检查参数和权限。"
        exit 1
    }
} catch {
    Write-Host "? 执行失败:$_"
    exit 1
}

# 过滤系统数据库
$systemDbs = @()
$databases = $databases | Where-Object { $systemDbs -notcontains $_ }

$outputFolder = Read-Input "请输入导出文件夹" ".\databases"
if (-not (Test-Path -Path $outputFolder)) {
    New-Item -ItemType Directory -Path $outputFolder | Out-Null
}

# 逐个导出数据库
foreach ($db in $databases) {
    Write-Host "开始导出数据库:$db ..."
    $dumpFile = "$outputFolder\$db.sql"
	$errFile = "$outputFolder\$db.log"
	$arguments = @()
	$arguments += $mysqlParams
	$arguments += $mysqldumpOptions
	$arguments += $db
	Start-Process -FilePath ./mysqldump -ArgumentList $arguments -NoNewWindow -Wait -RedirectStandardOutput $dumpFile -RedirectStandardError $errFile
    if ($LASTEXITCODE -eq 0) {
        Write-Host "成功导出 $dumpFile"
    } else {
        Write-Host "导出 $db 失败"
    }
}

Write-Host "全部数据库导出完成。"
# 按任意键退出
Write-Host "`n按任意键退出..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")