2015-01-04 164 views
0

我已經掌握了使用PowerShell執行以下SQL腳本。將輸出存儲在CSV文件中

cls 
foreach ($svr in get-content "demo.txt") 
{ 
    $con = "server=MC1-PQ10X.RF.LILLY.COM\SQL01;database=mylilly_WSS_Content_INCTSK0014840;Integrated Security=sspi" 

    $cmd = "SELECT 
Docs.DirName + '/' + Docs.LeafName AS 'Item Name', 
DocVersions.UIVersion, 
(DocVersions.UIVersion/512) as Version_Label, DocVersions.Level, DocVersions.TimeCreated 
FROM DocVersions FULL OUTER JOIN Docs ON Docs.Id = DocVersions.Id 
-- INNER JOIN Webs On Docs.WebId = Webs.Id 
--INNER JOIN Sites ON Webs.SiteId = SItes.Id 
WHERE (DirName LIKE '%globalcontentrepository%') 
AND (IsCurrentVersion = '0') 
AND (DocVersions.Id IN ('$svr'))" 

    $da = new-object System.Data.SqlClient.SqlDataAdapter ($cmd, $con) 

    $dt = new-object System.Data.DataTable 

    $da.fill($dt) |out-null 

    $dt | Export-Csv music.csv -Encoding ascii -NoTypeInformation 
} 

我正在面對上述代碼的問題是關於輸出。對於每個$svr此代碼正在創建一個新的CSV文件。輸入文件包含大約1000個輸入。我的要求是所有的輸出應該存儲在同一個文件中,而不是創建新文件。

+3

我根本不知道powershell等,但文檔講述了一個'-Append'參數:http://technet.microsoft.com/en-us/library/hh849932.aspx – PeterMmm

回答

4

有幾種方法可以實現您的目標。一是要追加到輸出文件@PeterMmm在評論你的問題建議:

foreach ($svr in Get-Content "demo.txt") { 
    ... 
    $dt | Export-Csv music.csv -Encoding ascii -NoTypeInformation -Append 
}

但是請注意,這Export-Csv不支持之前的PowerShell v3的追加。此外,追加通常會對性能產生負面影響,因爲您必須重複打開輸出文件。最好將導出cmdlet放在循環外部並一次寫入輸出文件。 foreach循環不與管道發揮很好,雖然如此,你必須環路輸出分配給一個變量第一:

$music = foreach ($svr in Get-Content "demo.txt") { 
    ... 
    $dt 
} 
$music | Export-Csv music.csv -Encoding ascii -NoTypeInformation 

或子表達式運行它:

(foreach ($svr in Get-Content "demo.txt") { 
    ... 
    $dt 
}) | Export-Csv music.csv -Encoding ascii -NoTypeInformation 

我個人倒是喜歡ForEach-Object循環在foreach循環,因爲前者不與管道運行良好:

Get-Content "demo.txt" | ForEach-Object { 
    ... 
    $dt 
} | Export-Csv music.csv -Encoding ascii -NoTypeInformation 

注意,您必須[R儘管如此,將你的循環變量$svr的每一次出現都與「當前對象」變量$_置換起來。