2014-12-05 33 views
0

我想從我製作的SQL查詢中創建一個CSV文件(如果可能,不帶標頭)。我的powershell在下面。它讀取數據庫沒有問題,我看到行結果從printint返回到標準輸出。但我似乎無法弄清楚如何將結果導入CSV文件。試圖從SQL查詢中寫入數據集到Powershell中的CSV文件

從我的PowerShell中創建的TXT文件只有一行是:

TYPE System.Int32

這似乎對我來說,它只是outputing數據類型或東西。看起來很奇怪,它是In32,但也許這是因爲它是一個指向對象的指針?

我看到一篇文章使用數據集時使用表[0],但當我用 替換最後一行時$ QueryResults.Tables [0] | export-csv c:\ tests.txt 它給了我一個錯誤,說它無法將參數綁定到參數,因爲它是空的。

function Get-DatabaseData { 
param (
    [string]$connectionString, 
    [string]$query, 
    [switch]$isSQLServer 
) 
if ($isSQLServer) { 
    Write-Verbose 'in SQL Server mode' 
    $connection = New-Object -TypeName System.Data.SqlClient.SqlConnection 
} else { 
    Write-Verbose 'in OleDB mode' 
    $connection = New-Object -TypeName System.Data.OleDb.OleDbConnection 
} 
$connection.ConnectionString = $connectionString 
$command = $connection.CreateCommand() 
$command.CommandText = $query 
if ($isSQLServer) { 
    $adapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $command 
} else { 
    $adapter = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $command 
} 
$dataset = New-Object -TypeName System.Data.DataSet 
$adapter.Fill($dataset) 
$dataset.Tables[0] 
} 

$QueryResults = Get-DatabaseData -verbose -connectionString 'Server=localhost\SQLEXPRESS;;uid=sa; pwd=Mypwd;Database=DanTest;Integrated Security=False;' -isSQLServer -query "SELECT * FROM Computers" 
foreach($MyRow in $QueryResults) { 
write-output $MyRow.computer 
write-output $MyRow.osversion 
} 

$QueryResults | export-csv c:\tests.txt 

我添加了一行打印$ QueryResults到stdout以下是在該控制檯輸出和寫我形成了循環顯示什麼我$ QueryResults了。

5 


computer   : localhost 
osversion  : 
biosserial  : 
osarchitecture : 
procarchitecture : 

computer   : localhost 
osversion  : 
biosserial  : 
osarchitecture : 
procarchitecture : 

computer   : not-online 
osversion  : 
biosserial  : 
osarchitecture : 
procarchitecture : 

computer   : 
osversion  : win8 
biosserial  : 
osarchitecture : 
procarchitecture : 

computer   : dano 
osversion  : win8 
biosserial  : 
osarchitecture : 
procarchitecture : 

localhost 

localhost 

not-online 


win8 
dano 
win8 

回答

0

如果你只想在CSV文件中的數據,通過-NoTypeInformation切換到Export-CSV

0

您可能有循環問題,因爲您的$QueryResults可能不包含您正在查找的數據。在控制檯中,$QueryResults的外觀如何?一旦你解決,這應該照顧你的輸出。

TechNet

默認情況下,CSV文件的第一行包含「#TYPE」後面的對象類型的完全限定名稱。

爲了解決這個問題,你只需要使用如Alroc建議的-NoTypeInformation開關。不過,你也提到刪除標題,這將需要一個不同的方法。

$QueryResults | ConvertTo-CSV -NoTypeInformation | Select-Object -Skip 1 | Set-Content "c:\tests.txt" 

或者稍微有些不同,有相同的結果。

$QueryResults | ConvertTo-CSV | Select -Skip 2 | Set-Content "c:\tests.txt" 

轉換的$QueryResults到csv對象。但是,您選擇省略包含類型信息和標題/行標題的行。在這一點上應該只有數據。

更新從討論

ConvertTo-CSVExport-CSV沒有顯示預期的數據,但沒有除了類型信息。起初我並沒有真正注意到,但$QueryResults的輸出包含第一行,只是數字5.推測它是結果數據集中的記錄數。如果我們跳過$QueryResults的第一條記錄,那麼我們只剩下所需的數據。可能更好地研究第一條線的原因(也許有辦法抑制它)。由於目前的問題,我們解決這個問題如下。第一個跳過是忽略「5」行,第二個跳過是從csv輸出中刪除標題。

$QueryResults | Select -Skip 1 | Convert-ToCSV -NoTypeInformation | Select-Object -Skip 1 | Set-Content "c:\tests.txt" 
+0

謝謝你們。我在原來的問題中添加了$ QueryResults的輸出到控制檯以及我的for循環的輸出,其中我打印了計算機和osversion值。 – user461051 2014-12-05 13:01:29

+0

也許我不明白在for循環中的$ MyRow值應該是什麼。我認爲這將是數據集中的每條記錄,然後我希望我的寫入輸出能夠打印計算機,然後是每行的osversion。但在輸出中,我得到它是首先打印所有三個計算機值,然後所有3 osversions – user461051 2014-12-05 13:12:53

+0

我想出了我對MyRow值的誤解。它看起來不是我在foreach循環中得到的一行,而是在數據集第一列中的所有值。所以我添加了foreach塊來打印到標準輸出。例如($ aRow in $ MyRow.computer){$ aRow}給出所有計算機名稱。 – user461051 2014-12-05 13:21:36