我已经使用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个输入。我的要求是所有输出应该存储在同一个文件中,而不是创建新文件。
答案 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
。但是变量$_
可以使用。