将输出存储在CSV文件中

时间:2015-01-04 09:40:37

标签: powershell

我已经使用PowerShell执行以下SQL脚本。

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个输入。我的要求是所有输出应该存储在同一个文件中,而不是创建新文件。

1 个答案:

答案 0 :(得分: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

请注意,您必须使用"当前对象"替换每次出现的循环变量$svr。但是变量$_可以使用。