2016-03-11 5 views
0

Я просматриваю список серверов sql, запрашивая данные и создавая набор данных, который отлично работает. Набор данных передается в файл csv, который имеет все строки. Затем я пытаюсь создать и массировать из каждой строки, а затем отправить результаты по электронной почте. Письмо отправляется, но содержимое содержит только записи с последнего сервера в списке.Доступ ко всем строкам в наборе данных с помощью powershell

ForEach ($instance in Get-Content "D:\servers\sqlservers2.txt") 
{ 

$SQLServer = "$instance" #use Server\Instance for named SQL instances! 
$SQLDBName = "msdb" 
$SqlQuery = " 

Select 
@@servername as [Server], 
j.[name] AS [JobName], 
run_status = CASE h.run_status 
WHEN 0 THEN 'Failed' 
WHEN 1 THEN 'Succeeded' 
WHEN 2 THEN 'Retry' 
WHEN 3 THEN 'Canceled' 
WHEN 4 THEN 'In progress' 
END, 
h.run_date AS LastRunDate, 
h.run_time AS LastRunTime 
FROM sysjobhistory h 
INNER JOIN sysjobs j ON h.job_id = j.job_id 
    WHERE j.enabled = 1 
    and j.name not like 'copytosan' 
    and j.name not like 'syspolicy%' 
    and j.name not like '%log%' 
    AND h.instance_id 

    IN 

    (SELECT MAX(h.instance_id) 
     FROM sysjobhistory h GROUP BY (h.job_id)) 
" 



$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = 
$SQLServer; Database = $SQLDBName; Integrated Security = True" 


$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 

$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 

$SqlConnection.Close() 
#File is created with all rows from dataset 
$DataSet.Tables[0] | Out-File D:\servers\myfiles.csv -Append 
} 
foreach ($line in $dataset.tables[0]) 
{ 
$body += $line 
} 
# (Out-String -InputObject $body -Width 100) 
Send-MailMessage -To [email protected] -from [email protected] -Subject Test12345 -body (Out-String -InputObject $body -Width 100) -SmtpServer [email protected]  

ответ

0

Вам необходимо вставить вторую петлю. Таким образом, он будет проходить через строки каждой таблицы, а не только последнюю таблицу.

ForEach ($instance in Get-Content "D:\servers\sqlservers2.txt") 
{ 
    # code 
    foreach ($line in $dataset.tables[0]) 
    { 
     $body += $line 
    } 
} 
+0

Я знал, что это что-то простое. спасибо – Altirisguru

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