2016-09-16 2 views
1

Моя цель состоит в том, чтобы сценарий PowerShell запускал несколько файлов Sqlquery.sql с определенным 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

У вас отсутствует флаг -append для Out-File? –

ответ

0

Во-первых, как отметил в своем комментарии @Ben Thul, проверьте, чтобы ваши файлы SQL фактически выводили что-то (набор результатов или сообщения), запуская их в Management Studio.

Затем вам нужно будет использовать флаг -Verbose, как сообщит вам эта команда.

Get-Help Invoke-Sqlcmd -Full 

Invoke-Sqlcmd не возвращает вывод сообщений сервера SQL, такие как выход операторов 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" 
} 
1

Основная причина вы не получили ничего в лог-файл, что Output-File переписан весь в нем данные при каждом запуске. Попробуйте использовать -Verbose, как указано в ответе на TechSpud собирать заявления печати/сервер, или записать выход в временный файл и 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

Это привело меня туда, где мне нужно быть. спасибо за помощь –

Смежные вопросы