You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法使用原生库连接,如何解析命令行SQL输出为可检索表格

问题:解析Plesk命令输出为可操作的表格数据

我尝试解析某命令输出的SQL结果,无法使用MySQL .Net Connector这类原生库进行连接,但该命令输出的格式与原生库返回的结果一致。请问是否有办法将该输出解析为表格形式,实现类似原生库的行检索等操作,以便后续使用name和php_handler_id变量并打印?

附执行的PowerShell命令及输出:

PS> plesk db "SELECT d.name,h.php_handler_id FROM domains d JOIN hosting h ON h.dom_id=d.id WHERE h.php_handler_id NOT LIKE '%fastcgi-5.6%' OR '%fastcgi-7%';"
+-----------------------------------------------------+----------------+
| name               | php_handler_id |
+-----------------------------------------------------+----------------+
| cms.123.com        | cgi-           |
| 99923.com          | cgi-           |
| cms4.123.com       | cgi-4          |
-----------------------------------------------------------------------

回答

当然有办法!既然你是用PowerShell执行的Plesk数据库查询命令,我们可以直接在PowerShell里把这个文本输出解析成结构化的对象集合,这样就能像使用原生数据库库返回的结果集一样,轻松实现行检索、字段访问等操作。

下面是具体的实现步骤和代码:

1. 捕获命令输出

首先把Plesk命令的输出捕获到变量中,方便后续处理:

$rawOutput = plesk db "SELECT d.name,h.php_handler_id FROM domains d JOIN hosting h ON h.dom_id=d.id WHERE h.php_handler_id NOT LIKE '%fastcgi-5.6%' OR '%fastcgi-7%';"

2. 过滤无效行

原始输出里包含分隔线(+---、----这类)和可能的空行,我们先把这些无效内容过滤掉:

# 只保留表头和数据行,剔除分隔线、空行
$filteredLines = $rawOutput | Where-Object { 
    $_ -notmatch '^[+=-]+$' -and $_ -notmatch '^\s*$' 
}

3. 提取表头和转换数据为对象

接下来我们提取表头字段,然后把每一行数据转换成PowerShell自定义对象——这样你就能像访问对象属性一样访问name和php_handler_id了:

# 提取表头并处理成干净的字段名
$headers = ($filteredLines[0] -replace '^\|', '' -replace '\|$', '' -split '\s*\|\s*').Trim()

# 把数据行转换成自定义对象集合
$parsedResults = $filteredLines | Select-Object -Skip 1 | ForEach-Object {
    # 分割每一行的数据值
    $values = ($_ -replace '^\|', '' -replace '\|$', '' -split '\s*\|\s*').Trim()
    # 创建自定义对象
    $rowObj = [PSCustomObject]@{}
    for ($i=0; $i -lt $headers.Count; $i++) {
        $rowObj | Add-Member -MemberType NoteProperty -Name $headers[$i] -Value $values[$i]
    }
    $rowObj
}

4. 像操作数据库结果集一样使用数据

现在$parsedResults就是一个结构化的对象集合,你可以用各种PowerShell操作来处理它:

示例1:遍历所有行并打印字段值

foreach ($row in $parsedResults) {
    Write-Host "域名: *$($row.name)* | PHP处理器ID: *$($row.php_handler_id)*"
}

示例2:检索特定条件的行(比如name包含cms的域名)

$cmsDomains = $parsedResults | Where-Object { $_.name -like '*cms*' }
# 输出筛选结果
$cmsDomains

示例3:排序、分组等操作

# 按php_handler_id分组
$groupedByHandler = $parsedResults | Group-Object -Property php_handler_id
# 按域名名称排序
$sortedResults = $parsedResults | Sort-Object -Property name

这种方式完全模拟了原生数据库库返回结果的使用体验,你可以轻松把name和php_handler_id作为变量用于后续的任何逻辑。


内容的提问来源于stack exchange,提问作者Pablo R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:44