2015-01-04 127 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的每一次出现都与“当前对象”变量$_置换起来。