PowerShell自定义函数返回值多出非预期数据库连接信息原因求解
问题成因
PowerShell的函数返回逻辑和大部分编程语言不同:所有未被捕获、未被丢弃的输出内容都会被自动加入到函数的返回流中,并非只有return语句后指定的变量才会作为返回值。
你代码里存在两个会产生额外输出的问题:
- 第6行单独写了
$dbConnectionString,这行没有赋值给变量,也没有丢弃输出,连接字符串的值会直接写入返回流 - catch块中的
$_.Exception.Message也没有做捕获处理,如果触发异常,异常信息也会被加入到返回值中
另外你的代码还存在两个隐性错误:
- Invoke-Sqlcmd的连接字符串参数用了不存在的变量
$edwConnectionString,你定义的连接字符串变量是$dbConnectionString - SQL语句多写了一个
from,正确写法是SELECT top 1 fruitname FROM fruits
修复方案
针对上述问题逐一调整即可,核心是把不需要加入返回流的内容要么删除、要么用Out-Null丢弃、要么改为Write-Host直接输出到控制台(Write-Host的输出不会进入返回流)。
修复后的示例代码:
function Get_A_SINGLE_FRUIT_NAME{ $queryString = "SELECT top 1 fruitname FROM fruits"; $dbConnectionString = "a-real-conn-string-was-here" # 不需要这行调试内容可以直接删除,需要的话可以加Out-Null丢弃输出,或者用Write-Host输出到控制台 # $dbConnectionString | Out-Null Invoke-Sqlcmd -ConnectionString $dbConnectionString -Query $queryString -MaxCharLength 50000 -OutVariable sqlReturn |Out-Null $returnString="No fruitname found" foreach($queryResultRow in $sqlReturn){ try{ [String]$returnString = $queryResultRow.fruitname write-host("fruitname found:"+$returnString); }Catch{ # 异常信息改为Write-Host输出,不进入返回流 write-host $_.Exception.Message } Break } return $returnString } $qryOut = Get_A_SINGLE_FRUIT_NAME write-host("qry out:"+$qryOut);
内容的提问来源于stack exchange,提问作者Doc
相关产品推荐
相关产品推荐

