2015-06-23 9 views
0

У меня возникли проблемы с получением моих результатов (снимок экрана ниже) для вывода в мою базу данных (Hal0Test). Из моего исследования в Интернете я нашел несколько фрагментов кода, но я не слишком уверен в «объявлении» в отношении моего кода. ТАКЖЕ, вывод HTML - это только для меня, чтобы увидеть результаты без необходимости открывать SQL-управление каждый раз и обновлять. Моя конечная цель - получить всю серверную информацию в моей базе данных Hal0Test.Выходное значение SQL Server

Вопросы:

  1. HTML talbe будет показывать только последний сервер в списке, но при отладке и в консоли он будет показывать результат всех моих серверов.

  2. Таблица 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 Результаты:

enter image description here

+2

«CSV» открыт в Excel?Excel предполагает разделители запятой, если вы не используете мастер импорта текста и не указываете альтернативный разделитель, например, канал. Я также хотел бы использовать другой внутренний разделитель для дисков – Matt

+1

Почему бы не использовать SqlBulkCopy или BCP в PowerShell? http://stackoverflow.com/questions/3526368/help-me-use-powershell-and-bcp-to-load-csv-into-sql-server – lucazav

+0

Я думаю, что SqlBulkCopy слишком сложна для моих простых потребностей нажатия всего 4 значения для 5 серверов в одну базу данных. @lucazav – TheAce

ответ

1

Проверьте значение $command.CommandText - Держу пари, что это не то, что вы думаете, что это.

Когда вы используете свойства объекта внутри строки, его необходимо обернуть в $(). Так что это»

$command.CommandText = "UPDATE ServerList SET FQDN = '$_', OS = '$os.Caption' WHERE ServerName = '$os.PSComputerName';" 

Становится это:

$command.CommandText = "UPDATE ServerList SET FQDN = '$_', OS = '$($os.Caption)' WHERE ServerName = '$($os.PSComputerName)';" 

Или вы могли бы использовать PreparedStatement и установить значение в качестве параметров, устраняя эту строку манипуляции (и предотвращение неожиданной одинарную кавычки от губить ваш день) .

но я думаю, что проблема гораздо глубже, чем это. значения в $ServerArray не FQDN,, но в вашем Foreach-Object цикле, который, как вы их обработки. Внутри этого цикла, $_ является ва вы получили из поля ServerName на ServerList - поэтому пункт WHERE вашего UPDATE ничего не находит.

В вашем цикле, чтобы получить полное доменное имя, используйте Get-ADComputer:

get-adcomputer $_|Select-Object -ExpandProperty dnshostname 

Вы также должны хранить это где-то, чтобы положить его в UPDATE заявление.

$FQDN = get-adcomputer $_|Select-Object -ExpandProperty dnshostname; 
$command.CommandText = "UPDATE ServerList SET FQDN = '$FQDN', OS = '$($os.Caption)' WHERE ServerName = '$_';" 

Объяснение, почему Excel не открывает файл, как вы ожидали уже дали - когда вы дважды щелкните файл CSV, Excel предполагает, что это разделенный запятыми. Вам нужно сделать File-> Open и проделать мастер, чтобы сообщить ему, что ваш разделитель.

Я бы очень хотел взломать здесь весь сценарий, но на данный момент не хватает времени.

+0

Большое спасибо @alroc. Поэтому я решил полностью удалить весь CSV и просто получить html-выход, чтобы я мог видеть, какие у меня результаты. Однако меняется ли ваш ответ с помощью моего нового кода? – TheAce

+0

Всякий раз, когда вы получаете шанс @alroc, обновление было бы БОЛЬШИМ. Новый код использует html вместо csv, так что, надеюсь, упростится. Дайте мне знать, если вам нужно что-нибудь с моего конца! – TheAce

+1

HTML отлично подходит для вывода, если это ваше истинное требование для вывода. Я предпочитаю хранить вещи в CSV или базу данных, чтобы ее легче использовать для дальнейшей обработки. – alroc

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