【问题标题】:Powershell datareader returns unwanted textPowershell 数据读取器返回不需要的文本
【发布时间】:2021-11-05 12:37:05
【问题描述】:

我需要一些帮助,结果字符串应该只是“这是一个测试”,但是当我执行写入输出时它也会返回一些其他服务器信息:

$conStringCor = "Server=SERVER; Initial Catalog=master;"
$corCred = New-Object System.Data.SqlClient.SqlCredential("user","pwd")

function GetScalarSQL($con_str, $cred, $cmd_text)
{  
    $result = [string]::Empty   
    $conn = New-Object System.Data.SqlClient.SqlConnection($con_str, $cred)   
    try
    {
        $conn.Open()
        $tran = $conn.BeginTransaction()
        $cmd = $conn.CreateCommand()
        $cmd.Transaction = $tran
        $cmd.CommandTimeout = 300
        $cmd.CommandType = [System.Data.CommandType]::Text
        $cmd.CommandText = $cmd_text    
        $dr = $cmd.ExecuteReader()    
        if ($dr.Read())
        {
            $result = ($dr.GetValue(0))
        }
        $dr.Close()
        $dr.Dispose()
        $cmd.Dispose()
        $tran.Commit();
    }
    catch [Exception]
    {
        if($tran -ne $null){      
            $tran.Rollback();
        }
        throw $_.Exception
    }
    finally
    {
        $conn.Clone()
        $conn.Dispose()
    }

    return $result
}

try
{
    $updatesForDB = [string]::Empty
    $updatesForDB = GetScalarSQL $connString $corCred "select 'this is a test' as [test]"
    Write-Output $updatesForDB
        
}
catch [Exception]
{
    #Do something with the exception 
    Write-Output $_.Exception.ToString()
    #Write-Error "Job Failure" -EA Stop
    Write-Error $_.Exception.ToString() -EA Stop
}

Write-Output $updatesForDB 的输出是:

StatisticsEnabled : 假 访问令牌: 连接字符串:服务器=XXXXX;初始目录=主; 连接超时:15 数据库:主 数据源:XXXXXX 数据包大小:8000 ClientConnectionId:00000000-0000-0000-0000-000000000000 服务器版本: 状态 : 关闭 工作站编号:XXXXXXX 凭证: FireInfoMessageEventOnUserErrors:假 地点 : 容器:

这是一个测试

谢谢,

【问题讨论】:

  • 我建议将您未捕获的任何方法传递给| Out-Null。例如$dr.Dispose() | Out-Null
  • 哦,我在函数中有 $conn.Clone() 而不是 $conn.Close() 更改此解决了问题,谢谢!
  • 如果您需要参数,请小心使用这种方法,因为在 PowerShell 中很容易使用字符串插值来执行此操作,这是一种自然且几乎不可避免的诱惑——但这会导致各种问题SQL注入和转义。如果我可以让您对stealing a bit of ready-made code 感兴趣...请注意,如果您确实只需要一个值,SqlCommand.ExecuteScalar() 会明确处理您现在正在做的事情。
  • 好点,谢谢!

标签: sql-server powershell


【解决方案1】:

这实际上是一个常见的 PowerShell 问题。 PowerShell 会将函数输出的所有内容写入管道。这是没有通过分配消耗或以其他方式远离输出流的任何东西。这意味着您的 return 语句之前的任何内容,因此比您存储在 $Result 中的内容更多。

您应该做的是找出哪些方法调用或其他任何东西正在创建输出,然后将其通过管道传输到 Out-Null 或在它之前强制转换为 [Void]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多