我的目标是让PowerShell脚本针对特定SQL服务器运行多个Sqlquery.sql文件,然后将输出记录到日志文件中。
我无法让日志工作,我不知道我错过了什么。我的日志文件总是空的,我不知道我错过了。
C:\ Temp的内容:
Build1.SQL Build2.SQL Build3.sql Build4.sql Build5.SQL Build6.SQL
$PatchPostConvSQLScripts = Get-ChildItem -Path C::\Temp -Filter *.sql -Name
$Queries = $PatchPostConvSQLScripts
foreach ($query in $Queries){
Write-Host "Starting: $query"
Invoke-Sqlcmd -ServerInstance $DBServer -InputFile $query |
Out-File "C:\TEMP\scriptResults.log"
Write-Host "Completed: $query"
}
一旦我将其记录到文件中,我每次都需要使用`n`r
获取换行符,但宝贝现在就步了。
有没有更好的方法来做到这一点我还不知道?
答案 0 :(得分:1)
日志文件中没有任何内容的主要原因是Output-File
在每次运行时都会重写其中的整个数据。尝试使用TechSpud回答中提到的-Verbose
来收集打印/服务器语句,或将输出写入临时文件并将Add-Content
写入主日志文件:
$DBServer = "MYPC\SQLEXPRESS"
$sqlPath = "C:\TEMP\"
$log = "scriptResults.log"
$tempOut = "temp.log"
$files = Get-ChildItem -Path $sqlPath -Filter *.sql -Name
foreach ($file in $files){
Write-Host "Starting: $file"
Invoke-SQLcmd -ServerInstance $DBServer -InputFile $sqlPath$file | Out-File $sqlPath$tempOut
Get-Content $sqlPath$tempOut | Add-Content $sqlPath$log
Write-Host "Completed: $file"
}
答案 1 :(得分:0)
首先,正如@Ben Thul在他的评论中提到的,通过在Management Studio中运行它们来检查您的SQL文件是否实际输出了一些内容(结果集或消息)。
然后,您需要使用-Verbose标志,因为此命令会告诉您。
Get-Help Invoke-Sqlcmd -Full
Invoke-Sqlcmd不会返回SQL Server消息输出,例如 输出PRINT语句,除非使用PowerShell -Verbose参数。
$Queries = Get-ChildItem -Path C::\Temp -Filter *.sql -Name
Clear-Content -Path "C:\TEMP\scriptResults.log" -Force
foreach ($query in $Queries){
Write-Host "Starting: $query"
Invoke-Sqlcmd -ServerInstance $DBServer -InputFile $query -Verbose |
Add-Content -Path "C:\TEMP\scriptResults.log"
Write-Host "Completed: $query"
}