【问题标题】:Powershell Formatting Invoke-sqlcmdPowershell 格式化调用-sqlcmd
【发布时间】:2014-02-14 03:40:27
【问题描述】:

我正在创建一个脚本来从多个 SQL 服务器获取信息并将其泵入一个用户可以访问的文件,而不必一直打电话给我。我现在遇到的问题是格式化 invoke-sql 命令的输出,以便我可以将其放入哈希表中。我想在一列(即 Microsoft SQL Server 2008)中获取 SQL 版本,在第二列中获取内部版本号(即 10.0.5512.0)。以下是我创建的代码及其输出。如您所见,我得到了信息,但无法将其放入哈希表中。它只是将 ... 放入表格中。

$SQLVerPart1= Invoke-Sqlcmd -Query "select @@VERSION;" -ServerInstance $Server | Out-String | ForEach-Object { $_ -replace '-.*'}

$SQLVerPart2 = Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $Server | Out-String 

$SQLVerPart1 | Out-File -Append $Log
$SQLVerPart2 | Out-File -Append $Log
$SQLVer.add($SQLVerPart1,$SQLVerPart2)

输出:

第1列

微软 SQL Server 2008 (SP3)

第1列


10.0.5512.0

名称值

---- ----- ... ...

【问题讨论】:

    标签: sql powershell formatting


    【解决方案1】:

    您要尽量避免过早转换为字符串。变量分配中的 Out-String 包括每个对象的 Column1 标题。像这样获取原始属性:

    $SQLVerPart1 = (Invoke-Sqlcmd -Query "select @@VERSION" -ServerInstance $Server).Column1 -replace "\n", "" -replace '-.*' 
    $SQLVerPart2 = (Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $Server).Column1
    

    至于哈希表,你确定那是你想要的吗?如果您有两个“Microsoft SQL Server 2008 (SP3)”实例,则第二个添加将失败。也许您想要一个对象数组。类似的东西:

    $SQLVer = $ListOfServers | ForEach-Object {
      $SQLVerPart1 = (Invoke-Sqlcmd -Query "select @@VERSION" -ServerInstance $_).Column1 -replace "\n", "" -replace '-.*' 
      $SQLVerPart2 = (Invoke-Sqlcmd -Query "select SERVERPROPERTY ('productversion')" -ServerInstance $_).Column1
    
      New-Object -Type PSObject -Property @{ Version = $SqlVerPart1; BuildNumber = SqlVerPart2 }
    }
    

    然后您可以在收集数据后担心记录或输出:

    $SQLVer | Out-String
    

    【讨论】:

    • 这正是我所需要的。第二部分很有魅力,但我无法破译它。就哈希表而言,我只是循环遍历我的每台服务器并在开始时删除版本信息,然后再进入数据库、大小、所有者等其他内容,所以我认为你给出的第一部分我会做得很好。感谢您的快速回复!
    【解决方案2】:

    我用我的脚本做类似的事情。这不会让你 100% 到达那里,但它应该可以帮助你朝着你想要的方向前进。

    对于我的 SQL Server 审计脚本,我运行以下四个命令:

    $ProductVersion = Invoke-Sqlcmd2 -Query "SELECT SERVERPROPERTY('productversion')" -ServerInstance $InstanceName
    $ProductEdition = Invoke-Sqlcmd2 -Query "SELECT SERVERPROPERTY('edition')" -ServerInstance $InstanceName
    $CurrentTime = Invoke-Sqlcmd2 -Query "SELECT GETDATE()" -ServerInstance $InstanceName
    $UserName = Invoke-Sqlcmd2 -Query "SELECT SUSER_SNAME()" -ServerInstance $InstanceName
    

    后来,我创建了一个像这样的哈希表:

    $hashPropsFormalities = @{
        "Instance Name" = $InstanceName
        "Product Version" = $ProductVersion[0]
        "Product Edition" = $ProductEdition[0]
        "User Name" = $UserName[0]
        "Current Time" = $CurrentTime[0]
    }
    

    然后将哈希表打印到控制台:

    $hashPropsFormalities | FT -HideTableHeaders
    

    为了在文本文件中捕获控制台输出的副本,我使用了Start-Transcript(它是对应的Stop-Transcript)。

    【讨论】:

    • 谢谢。我将保留此代码以供将来参考。两者都是很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-01-08
    相关资源
    最近更新 更多