У меня возникли проблемы с получением моих результатов (снимок экрана ниже) для вывода в мою базу данных (Hal0Test). Из моего исследования в Интернете я нашел несколько фрагментов кода, но я не слишком уверен в «объявлении» в отношении моего кода. ТАКЖЕ, вывод HTML - это только для меня, чтобы увидеть результаты без необходимости открывать SQL-управление каждый раз и обновлять. Моя конечная цель - получить всю серверную информацию в моей базе данных Hal0Test.Выходное значение SQL Server
Вопросы:
HTML talbe будет показывать только последний сервер в списке, но при отладке и в консоли он будет показывать результат всех моих серверов.
Таблица SQL Server (ServerList) вообще не изменяется из приведенного ниже сценария powershell.
нового кода с HTML:
Write-Output " `n Start of Hal0 `n";
#Start of Server Connection
$connectionString = "Server=QAUTILITYDB01;Database=Hal0Test;Integrated Security=True;"
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
$command = $connection.CreateCommand()
$ServerArray = [System.Collections.ArrayList]@()
$query = "SELECT ServerName FROM ServerList"
$command.CommandText = $query
$ServerNames = $command.ExecuteReader()
$table = new-object “System.Data.DataTable”
$table.Load($ServerNames)
$ServerArray = $table | select -Expand ServerName
#Variables for each Server in Array
$ServerArray | ForEach-Object {
# $ServerArray returns each server name
#Operating System
$os = Get-WmiObject -Class Win32_OperatingSystem -Computer $_
#Server's Memory (RAM) Usage Average
$memAvg = gwmi -Class win32_operatingsystem -computername $_ |
Select-Object @{Name = "MemoryUsage"; Expression = {“{0:N2}” -f ((($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)*100)/ $_.TotalVisibleMemorySize) }}
#Server's CPU (Proccess) Usage Average
$cpuAVG = Get-WmiObject -computername $_ win32_processor |
Measure-Object -property LoadPercentage -Average | Select Average
#Server's Hard Drives (MB) Free/Used
$disks = Get-WmiObject -Class Win32_LogicalDisk -Computer $_ |
Where-Object {$_.DriveType -eq 3} |
ForEach-Object {
'{0} {1:D} MB Free/{2:D} MB Used' -f $_.DeviceID,
[int]($_.FreeSpace/1MB), [int]($_.Size/1MB)
}
New-Object -Type PSCustomObject -Property @{
'FQDN' = $_
'ServerName' = $os.PSComputerName
'OperatingSystem' = $os.Caption
'CPUAvg' = "$($cpuAVG.Average)%"
'MemAvg' = "$($memAvg.MemoryUsage)%"
'Disks' = $disks -join ' | '
}
$command.CommandText = "UPDATE ServerList SET FQDN = '$_', OS = '$os.Caption' WHERE ServerName = '$os.PSComputerName';"
$result = $command.ExecuteNonQuery()
$Outputreport = "<HTML><TITLE> IDI Server Report </TITLE>
<BODY background-color:peachpuff>
<font color =""#99000"" face=""Microsoft Tai le"">
<H2> IDI Server Report </H2></font>
<Table border=1 cellpadding=0 cellspacing=0>
<TR bgcolor=gray align=center>
<TD><B>Server Name</B></TD>
<TD><B>FQDN</B></TD>
<TD><B>CPU Usage</B></TD>
<TD><B>RAM Usage</B></TD>
<TD><B>Disk Space</B></TD>
<TD><B>Operating System</B></TD></TR>"
Foreach($Entry in $ServerArray)
{
if(($Entry.CPUAvg) -ge "2")
{
$Outputreport += "<TR bgcolor=#FF0000>"
}
else
{
$Outputreport += "<TR bgcolor=#E6E6FA>"
}
$Outputreport += "<TD>$($os.PSComputerName)</TD>
<TD align=center>$($_)</TD>
<TD align=center>$("$($cpuAVG.Average)%")</TD>
<TD align=center>$("$($memAvg.MemoryUsage)%")</TD>
<TD align=center>$($disks)</TD><TD align=center>$($os.Caption)</TD>
</TR>"
}
$Outputreport += "</Table></BODY></HTML>"
}
$Outputreport | out-file C:\Users\king\Desktop\HalO\ServerReport.html
Invoke-Expression C:\Users\king\Desktop\HalO\ServerReport.html
Write-Output "`n End of Hal0";
HTML Результаты:
«CSV» открыт в Excel?Excel предполагает разделители запятой, если вы не используете мастер импорта текста и не указываете альтернативный разделитель, например, канал. Я также хотел бы использовать другой внутренний разделитель для дисков – Matt
Почему бы не использовать SqlBulkCopy или BCP в PowerShell? http://stackoverflow.com/questions/3526368/help-me-use-powershell-and-bcp-to-load-csv-into-sql-server – lucazav
Я думаю, что SqlBulkCopy слишком сложна для моих простых потребностей нажатия всего 4 значения для 5 серверов в одну базу данных. @lucazav – TheAce