无法使用原生库连接,如何解析命令行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
相关产品推荐
相关产品推荐

