将输出存储在 CSV 文件中

Storing output in CSV file

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

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

有多种方法可以实现您的目标。一种是按照@PeterMmm 在您的问题的评论中建议的那样附加到输出文件:

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

但是请注意,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 替换为 "current object" 变量 $_ 才能正常工作。