2014-02-13 47 views
1

我創建了一個腳本來抓取來自多個SQL服務器的信息,並將其泵送到用戶可以訪問的文件,而不必一直打電話給我。我現在運行的問題是格式化invoke-sql命令的輸出,所以我可以把它放到散列表中。我想在一列(即Microsoft SQL Server 2008)中獲取SQL版本,在第二列中獲得版本號(即10.0.5512.0)。接下來是我創建的代碼和它輸出的內容。正如你所看到的,我得到的信息,但不能把它放入哈希表。它只是把......放在桌子上。Powershell格式化Invoke-sqlcmd

$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) 

OUTPUT:

列1

的Microsoft SQL Server 2008(SP3)

列1


10.0.5512.0

名稱值

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

回答

0

你想盡量避免轉換爲字符串太早。變量賦值中的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 
+0

這正是我所需要的。第二部分是一種魅力,但我無法破譯它。就哈希表而言,我只是循環遍歷每個服務器,並在開始進入其他資料(例如數據庫,大小,所有者等)之前刪除版本信息,因此我認爲您給出的第一部分我會做得很好。感謝您及時的回覆! –

0

我做同樣的事情......我的腳本。這不會讓你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] 
} 

然後打印哈希表的console:

$hashPropsFormalities | FT -HideTableHeaders 

爲了在文本文件中捕獲控制檯輸出的副本,我使用Start-Transcript(和它對應,Stop-Transcript)。

+0

感謝。我將繼續關注此代碼以供將來參考。兩者都是很好的答案。 –