将输出存储在 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" 变量 $_
才能正常工作。
我已经编写了以下 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" 变量 $_
才能正常工作。