如何用PowerShell存储SQL查询结果到变量并输出至网格视图
问题根因
你遇到的报错有两个核心原因:
- 路径变量定义顺序错误:你把
$plugins、$occonfig等依赖$customer的路径变量写在了$customer赋值之前,此时$customer要么是空值要么是命令行传入的初始值,后续你重新给$customer赋值后,路径变量不会自动更新 - 未显式取查询结果的字段值:
Invoke-Sqlcmd返回的每一行结果都是System.Data.DataRow类型的对象,你直接把这个对象赋值给$customer,字符串展开时就会显示类型名而非实际的数据库名
修复方案
调整代码顺序,显式提取查询结果的name字段值即可,修复后的完整代码如下:
<# .SYNOPSIS 用于将门户从EC2/appn(弗吉尼亚北部 us-east-1)迁移到VPC单元的脚本 .DESCRIPTION 本脚本当前为本地作用域编写,请登录Pacejet RDP后运行 .PARAMETER customer 要迁移的客户数据库名称 .EXAMPLE MigratePortal.ps1 -customer Decatur #> # 声明命令行参数 Param ( [string]$customer ) $ErrorActionPreference = "Stop" # 先查询数据库列表让用户选择 $customer = Invoke-Sqlcmd -Query "SELECT name FROM master.dbo.sysdatabases" | Out-GridView -Title '选择要迁移到VPC的数据库:' -PassThru | Select-Object -ExpandProperty name # 增加判断:如果用户未选择直接关闭弹窗,直接退出脚本 if (-not $customer) { Write-Host "未选择数据库,脚本退出" exit 1 } # 再定义依赖$customer的路径变量 $plugins = "\\dbn\SharedApp\WebServices\PacejetPreprocessWS\PluginLibraries\$customer\" $occonfig = "\\dbn\SharedApp\OpenConnectors\OpenConnector\Config\$customer.xml" $nsconfig = "\\dbn\SharedApp\OpenConnectors\OpenConnector\OpenConnectorPrograms\NetsuiteConfigs\$customer.xml" Write-Host "选中的客户数据库名为 $customer" if (Test-Path $plugins) {Write-Host "已检测到$customer的插件库"} else {Write-Host "$customer的插件库不存在"} if (Test-Path $occonfig) {Write-Host "已检测到$customer的Open Connector配置"} else {Write-Host "$customer的Open Connector配置不存在"} if (Test-Path $nsconfig) {Write-Host "已检测到$customer的NetSuite配置"} else {Write-Host "$customer的NetSuite配置不存在"}
关键修改说明
- 把路径变量的定义移到了
$customer赋值之后,确保路径使用的是用户选择的正确数据库名 - 通过
Select-Object -ExpandProperty name显式提取DataRow对象中的name字段值,让$customer存储的是纯字符串类型的数据库名 - 增加了用户未选数据库的异常判断,避免后续逻辑出现无意义的报错
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

