abstract
对于需要大量建站,并且站点类型都很接近的宝塔用户,可以考虑使用如下powershell脚本进行批量建站语句生成
请根据宝塔的要求的批量建站语句格式创建脚本
脚本详情
在线获取(打开powershell执行以下命令即可安装(临时地)获得相关命令)
irm https://gitee.com/xuchaoxin1375/scripts/raw/main/PS/Tools/Tools.psm1|iex
解析多个域名输入
function Get-LineDataFromMultilineString
{
<#
.SYNOPSIS
将多行字符串按行分割,并返回数组
对于数组输入也可以处理
.EXAMPLE
Get-LineDataFromMultilineString -Data @"
line1
line2
"@
#>
[cmdletbinding(DefaultParameterSetName = "Trim")]
param (
$Data,
[parameter(ParameterSetName = "Trim")]
$TrimPattern = "",
[parameter(ParameterSetName = "NoTrim")]
[switch]$KeepLine
)
# 统一成字符串处理
$Data = @($Data) -join "`n"
$lines = $Data -split "`r?`n|,"
if(!$KeepLine)
{
$lines = $lines | ForEach-Object { $_.trim($TrimPattern) }
}
return $lines
}
获取在宝塔中批量建站的语句
function Get-BatchSiteBuilderLines
{
<#
.SYNOPSIS
获取批量站点生成器的生成命令行(宝塔面板专用)
.DESCRIPTION
格式说明
批量格式:域名|根目录|FTP|数据库|PHP版本
案例: bt.cn,test.cn:8081|/www/wwwroot/bt.cn|1|1|56
最简单的站点:
域名|1|0|0|0
1. 域名参数:多个域名用 , 分割
2. 根目录参数:填写 1 为自动创建,或输入具体目录
3. FTP参数:填写 1 为自动创建,填写 0 为不创建
4. 数据库参数:填写 1 为自动创建,填写 0 为不创建
5. PHP版本参数:填写 0 为静态,或输入PHP具体版本号列如:56、71、74
如需添加多个站点,请换行填写
.NOTES
domain1.com
domain2.com
domain3.com
.EXAMPLE
#测试命令行
Get-BatchSiteBuilderLines -user zw -domains @"
domain1.com
domain2.com
domain3.com
"@
#回车执行
#>
<#
.EXAMPLE
#⚡️[Administrator@CXXUDESK][~\Desktop][20:48:14][UP:9.14Days]
PS> Get-BatchSiteBuilderLines -user zw "a.com,b.com"
a.com,*.a.com |/www/wwwroot/zw/a.com |0|0|84
b.com,*.b.com |/www/wwwroot/zw/b.com |0|0|84
#⚡️[Administrator@CXXUDESK][~\Desktop][20:48:15][UP:9.14Days]
PS> Get-BatchSiteBuilderLines -user zw @"
>> a.com
>> b.com
>> "@
a.com,*.a.com |/www/wwwroot/zw/a.com |0|0|84
b.com,*.b.com |/www/wwwroot/zw/b.com |0|0|84
.EXAMPLE
#⚡️[Administrator@CXXUDESK][~\Desktop][20:48:58][UP:9.14Days]
PS> Get-BatchSiteBuilderLines -user zw @(
>> 'a.com'
>> 'b.com')
a.com,*.a.com |/www/wwwroot/zw/a.com |0|0|84
b.com,*.b.com |/www/wwwroot/zw/b.com |0|0|84
#⚡️[Administrator@CXXUDESK][~\Desktop][20:49:13][UP:9.14Days]
PS> Get-BatchSiteBuilderLines -user zw @(
>> 'a.com'
>> 'b.com'
>> )
a.com,*.a.com |/www/wwwroot/zw/a.com |0|0|84
b.com,*.b.com |/www/wwwroot/zw/b.com |0|0|84
#>
[CmdletBinding()]
param (
# 使用多行字符串,相比于直接使用字符串,在脚本中可以省略去引号的书写
$domains = @"
domain1.com
www.domain2.com
"@,
$LD3 = "*" ,
$user,
$php = 74
)
$domains = @($domains) -join "`n"
# 统一成字符串处理
$domains = $domains.trim() -split "`r?`n|," | Where-Object { $_.Length }
$lines = [System.Collections.ArrayList]@()
# $domains = $domains -replace "`r?`n", ";"
# $domains = $domains -replace "`n", ";"
# Write-Verbose $domains
Write-Verbose "$($domains.Length)"
foreach ($domain in $domains)
{
Write-Verbose "[$domain]"
$domain = $domain.Trim() -replace "www.", ""
$line = "$domain,$LD3.$domain`t|/www/wwwroot/$user/$domain`t|0|0|$php" -replace "//", "/"
$line = $line.Trim()
Write-Host $line
$lines.Add($line) > $null
}
$lines | Set-Clipboard
Write-Host "`nlines copied to clipboard!" -ForegroundColor Cyan
}
获取批量创建数据库的语句
function Get-BatchSiteDBCreateLines
{
<#
.SYNOPSIS
获取批量站点数据库创建命令行
.DESCRIPTION
默认生成两种命令行,一种是可以直接在shell中执行,另一种是保存到sql文件中,最后调用mysql命令行来执行
第一种使用起来简单,但是开销大,而且构造语句的过程中相对比较麻烦,需要考虑powershell对特殊字符的解释
第二种命令简短,而且符号包裹更少,运行开销较小,理论上比第一种快;但是powershell对于mysql命令行执行
sql文件也相对麻烦,需要用一些技巧
#>
[CmdletBinding()]
param (
$domains = @"
domain1.com
domain2.com
"@,
# 指明网站的创建或归属者,涉及到网站数据库名字和网站根目录的区分
$SiteOwner,
#可以配置系统环境变量 df_server,可以是ip或域名
$server = $env:DF_SERVER1,
# 对于wordpress,一般使用utf8mb4_general_ci
$collate = 'utf8mb4_general_ci',
$MySqlUser = "root",
# 置空表示不输出sql文件
$SqlFielSavePath = "$home\Desktop\BatchSiteDBCreate-$SiteOwner.sql",
[Parameter(ParameterSetName = "UseKey")]
$MySqlkey = $env:DF_MysqlKey,
[parameter(ParameterSetName = "UseKey")]
[switch]$UseKey
)
$domains = @($domains) -join "`n"
$domains = $domains.trim() -split "`r?`n|," | Where-Object { $_.Length }
# $lines = [System.Collections.ArrayList]@()
# $sqlLines = [System.Collections.ArrayList]@()
$lines = New-Object System.Collections.Generic.List[string]
$sqlLines = New-Object System.Collections.Generic.List[string]
$password = ""
if($PSCmdlet.ParameterSetName -eq "UseKey")
{
if($UseKey -and $MySqlkey)
{
$password = " -p$MySqlkey"
}
}
Write-Verbose "读取的域名规范化(移除多余的空白和`www.`,使数据库名字结构统一)" -Verbose
foreach ($domain in $domains)
{
$domain = $domain.Trim() -replace "www.", ""
$line = "mysql -u$mysqlUser -h $server $password -e 'CREATE DATABASE ``${SiteOwner}_$domain`` CHARACTER SET utf8mb4 COLLATE $collate;' "
$sqlLine = 'CREATE DATABASE ' + " ``${SiteOwner}_$domain`` CHARACTER SET utf8mb4 COLLATE $collate;"
Write-Verbose $line
Write-Verbose $sqlLine
$lines.Add($line) > $null
$sqlLines.Add($sqlLine) > $null
# 两组前后分开,合并返回
# $lines = $lines + $sqlLine
$lines.AddRange($sqlLines)
# $line | Invoke-Expression
}
if($SqlFielSavePath)
{
$sqlLines | Out-File $SqlFielSavePath -Encoding utf8
}
return $lines
}
组织调用批量建站的命令
生成的sql文件位于桌面(可以自动执行)
function Start-BatchSiteBuilderLines-DF
{
param(
$user,
$domains,
$server = $env:DF_SERVER1,
$MySqlUser = "root",
$MySqlkey = "",
$SqlFielSavePath = "$home\Desktop\BatchSiteDBCreate-$user.sql"
)
$siteExpressions = Get-BatchSiteBuilderLines -user $user -domains $domains
# $siteExpressions | Set-Clipboard
Write-Host $siteExpressions
# Pause
$dbExpressions = Get-BatchSiteDBCreateLines -domains $domains -SiteOwner $user
Write-Warning "Please Check the sql lines,especially the siteOwner is exactly what you want!"
Write-Output $dbExpressions
# Pause
# foreach ($line in $dbExpressions)
# {
# $line | Invoke-Expression
# }
Write-Warning "Running the sql file (by cmd /c ... ),wait a moment please..."
if($MySqlkey)
{
$password = " -p$MySqlkey"
}
else
{
$password = ""
}
if(Test-Path $sqlFielSavePath)
{
Write-Verbose "File exist!" -Verbose
$expression = "cmd /c `" mysql -u $MySqlUser -h $server $password < ```"$sqlFielSavePath```" `""
Write-Host $expression
Invoke-Expression $expression
# cmd /c $expression
}
}
例
比如我手上有3个域名要建站,这个站分配给用户zw
domain1.com
domain2.com
domain3.com
那么执行上述函数
Get-BatchSiteBuilderLines -user zw -domains @"
domain1.com
domain2.com
domain3.com
"@
执行结果
#⚡️[Administrator@CXXUDESK][~\Desktop][9:24:43][UP:4.66Days]
PS> #测试命令行
>>
>> Get-BatchSiteBuilderLines -user zw -domains @"
>> domain1.com
>> domain2.com
>> domain3.com
>> "@
>> #回车执行
domain1.com,*.domain1.com |/www/wwwroot/zw/domain1.com |0|0|84
domain2.com,*.domain2.com |/www/wwwroot/zw/domain2.com |0|0|84
domain3.com,*.domain3.com |/www/wwwroot/zw/domain3.com |0|0|84
批量设置
以批量伪静态设置为例
进入宝塔->网站->网站列表中勾选需要处理的网站->列表下方下拉框中选择部署伪静态->点击批量操作(已选中)
比如要我选中的4个站点设置wordpress伪静态