我是 PowerShell 新手。并有一个问题。 我有一个有效的 PS1 脚本,它运行 SQL 查询来获取 ID 参数,然后从 Crystal Report 创建 PDF,根据返回的 SQL 查询形成另一个程序,然后循环返回的参数并重复。 我需要的是将 SQL 更新语句添加到 PS1 脚本中,该语句在创建 PDF 后根据从 SQL 查询返回的相同 ID 更新表。在继续处理下一个 ID 之前,或在脚本根据 ID 创建所有 PDF 之后。 这就是我需要添加到脚本中的内容。
Update DB2.dbo.table2
SET DB2.dbo.table2.Field_01 = 1
FROM DB2.dbo.table2
WHERE (DB2.dbo.Table2.ID = {ID})
运行的 SP1 脚本如下所示。
$serverName="MAIN"
$databaseName="DB1"
$sqlCommand="select ID from ID_Query"
$connectionString = "Data Source=$serverName; " +
"Integrated Security=SSPI; " +
"Initial Catalog=$databaseName"
$connection = new-object system.data.SqlClient.SQLConnection($connectionString)
$command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
$connection.Open()
$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataSet) | Out-Null
$connection.Close()
foreach ($Row in $dataSet.Tables[0].Rows)
{
$commandLine= -join(@'
"C:\Program Files (x86)\CR_Program\Program_name\CR_Printer.exe" -report="C:\Crystal_report.rpt" -exportformat=PDF -exportfile="c:\test\{Parameters.ID}.pdf" -parameters"
'@,$($Row[0]),@'
"
'@)
cmd /c $commandLine
}
我希望将列 field_01 标记为 1,这样脚本就不会为同一 ID 创建另一个 Crystal repoort.pdf,因为 ID 将被标记为 1,然后运行的查询将看不到它。
或者也许有更好的方法来做到这一点。
谢谢。
最佳答案
您可以将时间戳添加到文件名以及 DataTable
(查询结果)的第一个字段(假设它是 ID):
# After $connection.Close()
$crPrinter = "C:\Program Files (x86)\CR_Program\Program_name\CR_Printer.exe"
$report = "-report='C:\Crystal_report.rpt'"
foreach ($Row in $dataSet.Tables[0].Rows)
{
$now = [DateTime]::Now.ToString("yyMMddHHmmss")
$outputFile = "-exportfile='c:\test\Report_id_$Row[0]_$now.pdf' -parameters"
$commandLine= [string]::Format("{0} {1} {2}", $crPrinter, $report, $outputFile)
cmd /c $commandLine
Start-Sleep 1 # Sleeps the script to offset a second
}
关于mysql - 如何在 foreach 循环后向 powershell 添加 SQL 更新语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419466/