New_Micro_Learning/scripts/configure-xampp-mariadb.ps1

93 خطوط
3.8 KiB
PowerShell

param([switch] $Elevated)
$ErrorActionPreference = 'Stop'
if (-not $Elevated) {
$arguments = @(
'-NoProfile',
'-ExecutionPolicy', 'Bypass',
'-File', ('"{0}"' -f $PSCommandPath),
'-Elevated'
)
$process = Start-Process -FilePath 'powershell.exe' -ArgumentList $arguments -Verb RunAs -Wait -PassThru
exit $process.ExitCode
}
$xamppRoot = 'D:\Apps\Xammp'
$myIni = Join-Path $xamppRoot 'mysql\bin\my.ini'
$phpMyAdminConfig = Join-Path $xamppRoot 'phpMyAdmin\config.inc.php'
$controlPanelConfig = Join-Path $xamppRoot 'xampp-control.ini'
$mysqld = Join-Path $xamppRoot 'mysql\bin\mysqld.exe'
$mysql = Join-Path $xamppRoot 'mysql\bin\mysql.exe'
$logPath = Join-Path $PSScriptRoot '..\xampp-mariadb-setup.log'
foreach ($path in @($myIni, $phpMyAdminConfig, $controlPanelConfig, $mysqld, $mysql)) {
if (-not (Test-Path -LiteralPath $path)) {
throw "Required XAMPP file not found: $path"
}
}
if (-not (Test-Path -LiteralPath "$myIni.pre-port-3307")) {
Copy-Item -LiteralPath $myIni -Destination "$myIni.pre-port-3307"
}
if (-not (Test-Path -LiteralPath "$phpMyAdminConfig.pre-port-3307")) {
Copy-Item -LiteralPath $phpMyAdminConfig -Destination "$phpMyAdminConfig.pre-port-3307"
}
if (-not (Test-Path -LiteralPath "$controlPanelConfig.pre-port-3307")) {
Copy-Item -LiteralPath $controlPanelConfig -Destination "$controlPanelConfig.pre-port-3307"
}
$myIniContents = [IO.File]::ReadAllText($myIni)
$myIniContents = [Regex]::Replace($myIniContents, '(?m)^port\s*=\s*3306\s*$', 'port=3307')
[IO.File]::WriteAllText($myIni, $myIniContents, [Text.UTF8Encoding]::new($false))
$phpMyAdminContents = [IO.File]::ReadAllText($phpMyAdminConfig)
if ($phpMyAdminContents -match "\['port'\]") {
$phpMyAdminContents = [Regex]::Replace(
$phpMyAdminContents,
"(?m)^\$cfg\['Servers'\]\[\$i\]\['port'\].*$",
"`$cfg['Servers'][`$i]['port'] = '3307';"
)
} else {
$hostLine = "`$cfg['Servers'][`$i]['host'] = '127.0.0.1';"
$phpMyAdminContents = $phpMyAdminContents.Replace(
$hostLine,
"$hostLine`r`n`$cfg['Servers'][`$i]['port'] = '3307';"
)
}
[IO.File]::WriteAllText($phpMyAdminConfig, $phpMyAdminContents, [Text.UTF8Encoding]::new($false))
$controlPanelContents = [IO.File]::ReadAllText($controlPanelConfig)
if ($controlPanelContents -match '(?m)^\[ServicePorts\]$') {
if ($controlPanelContents -match '(?m)^MySQL=') {
$controlPanelContents = [Regex]::Replace($controlPanelContents, '(?m)^MySQL=.*$', 'MySQL=3307')
} else {
$controlPanelContents = [Regex]::Replace($controlPanelContents, '(?m)^\[ServicePorts\]$', "[ServicePorts]`r`nMySQL=3307")
}
} else {
$controlPanelContents = $controlPanelContents.TrimEnd() + "`r`n[ServicePorts]`r`nMySQL=3307`r`n"
}
[IO.File]::WriteAllText($controlPanelConfig, $controlPanelContents, [Text.UTF8Encoding]::new($false))
$listener = Get-NetTCPConnection -LocalPort 3307 -State Listen -ErrorAction SilentlyContinue
if (-not $listener) {
Start-Process -FilePath $mysqld -ArgumentList @('--defaults-file=D:/Apps/Xammp/mysql/bin/my.ini', '--standalone') -WindowStyle Hidden
}
$deadline = [DateTime]::UtcNow.AddSeconds(30)
do {
Start-Sleep -Milliseconds 500
$listener = Get-NetTCPConnection -LocalPort 3307 -State Listen -ErrorAction SilentlyContinue
} until ($listener -or [DateTime]::UtcNow -ge $deadline)
if (-not $listener) {
throw 'XAMPP MariaDB did not start on port 3307. Check mysql/data/mysql_error.log.'
}
& $mysql --protocol=TCP --host=127.0.0.1 --port=3307 --user=root --skip-column-names --execute='SELECT VERSION()' | Set-Content -LiteralPath $logPath
if ($LASTEXITCODE -ne 0) {
throw 'XAMPP MariaDB started but its local root connection failed.'
}
'XAMPP MariaDB is listening on 127.0.0.1:3307.' | Add-Content -LiteralPath $logPath