2016-09-16 41 views
1

我的目標是讓PowerShell腳本針對特定的SQL服務器運行多個Sqlquery.sql文件,然後將輸出記錄到日誌文件中。運行多個* .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,但寶寶現在幾步之遙。

有沒有更好的方法來做到這一點,我只是不知道?

+3

愚蠢的問題,但做你的腳本* *生成任何輸出?也就是說,如果你在不將'invoke-sqlcmd'調用管道輸出到'out-file'的情況下運行它們,屏幕上是否會輸出? –

+2

你是否錯過了Out-File的-append標誌? –

回答

0

首先,正如@Ben Thul在他的評論中提到的那樣,通過在Management Studio中運行它們來檢查SQL文件是否實際輸出了一些內容(結果集或消息)。

然後,您需要使用-Verbose標誌,因爲此命令會告訴您。

Get-Help Invoke-Sqlcmd -Full 

調用-SQLCMD不返回SQL Server郵件輸出,如打印語句的 輸出,除非你使用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" 
} 
1

你有沒有在日誌文件中的主要原因是它在每次運行該Output-File重寫整個數據。嘗試使用-Verbose提到在回答通過TechSpud收集打印/ server語句,或將輸出寫入臨時文件和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" 
} 
+0

這讓我到了我需要的地方。感謝您的幫助 –