2013-03-14 3 views
-1

여러 시스템에서 시스템 가동 시간 정보를 수집 한 다음 전자 메일로 보내는 powershell 스크립트를 작성하려고합니다. 전자 메일을 형식화하여 합리적인 방법으로 구조화하고 나중에 시스템에 대한 자세한 정보를 추가 할 수 있습니다.배열을 배열하고 powershell을 사용하여 전자 메일에 포함

오늘 시스템 목록에 대한 가동 시간 정보를 수집 한 다음이 정보를 배열의 전자 메일에 포함 된 SendMail 함수에 전달하는이 스크립트가 있습니다. 그러나 현재 출력은 이와 같습니다.

 
Uptime list:  Restarted 02/19/2013 04:04:52 MyServer01  Computer Uptime: 23 days and 9 hours Restarted 02/15/2013 04:17:40 MyServer02 Computer Uptime: 27 days and 9 hours 

I 출력 또는 오히려 전자 메일 텍스트가 더 좋아하고 싶은 :

 
System  | Restarted date/time | Uptime 
MyServer01  02/17/2013 04:04:52 25 days and 9 hours 
MyServer02  02/17/2013 04:04:52 25 days and 9 hours 

I 전자 메일의 텍스트를 포맷하거나 내가 전에 그렇게해야 할 수있는 방법을 배열을 전자 메일 기능에 전달합니다.

스크립트 자체는 :

`

function SendMail([string]$arg1){ 

    #SMTP server name 
    $smtpServer = "mysmtp" 

    #Creating a Mail object 
    $msg = new-object Net.Mail.MailMessage 

    #Creating SMTP server object 
    $smtp = new-object Net.Mail.SmtpClient($smtpServer) 

    #Email structure 
    $msg.From = "[email protected]" 
    $msg.ReplyTo = "[email protected]" 
    $msg.To.Add("[email protected]") 
    $msg.subject = "System uptime" 
    $msg.body = ("List og servers and uptime:" + $arg1) 

    #Sending email 
    $smtp.Send($msg)} 


function CheckUptime($listofservers){ 
    $k [email protected]() 
    foreach($s in $listofservers){ 
     $Booted = Get-WmiObject -Class Win32_OperatingSystem -Computer $s 
     $Calc = [DateTime]::Now - $Booted.ConvertToDateTime($Booted.LastBootUpTime) 
     $k +=  " Restarted " + 
     $Booted.ConvertToDateTime($Booted.LastBootUpTime) + 
     " " + $s + " " + 
     " Computer Uptime: " + 
     $Calc.days + " " + 
     "days and", $Calc.hours + " hours" 
     } 
     return $k 
} 



#Defining list og servers 
$listofservers = "MyServer01", "MyServer02" 

#Calling function 
$message = CheckUptime($serverlist) 
SendMail($message) 

`

답변

1

첫째, 샘플도 작업 예제 아닌 약간의 노력을 보여줍니다. 변수 오타 등

해결책으로, 각 서버에 대한 데이터를 포함하는 사용자 지정 개체를 만들어서 배열로 출력하지 않는 이유는 무엇입니까? 같은 뭔가 :

PS > function CheckUptime($listofservers){ 
    $res = @() 

    foreach($s in $listofservers){ 
     $boot = Get-WmiObject win32_operatingsystem -ComputerName $s | % { $_.ConvertToDateTime($_.LastBootUpTime) } 
     $uptime = [DateTime]::Now - $boot 
     $res += New-Object psobject -Property @{ 
      Server = (Get-Culture).TextInfo.ToTitleCase($s) 
      BootTime = $boot 
      Uptime = "{0} days and {1} hours" -f $uptime.Days, $uptime.Hours 
     } 
    } 

    #Output 
    $res 
} 

$myservers = "localhost", "localhost" 

$str = "List of servers and uptime:`r`n" 

$str += CheckUptime $myservers | Out-String 

PS > $str 
List of servers and uptime: 

Server       Uptime       BootTime 
------       ------       -------- 
Localhost       8 days and 6 hours    06.03.2013 09:33:37 
Localhost       8 days and 6 hours    06.03.2013 09:33:37 
1

사용 Format-TableOut-String로 포맷 된 데이터를 포함하는 단일 문자열로 변환 할 필요에 따라 데이터 및 파이프를 포맷합니다.

그런 다음 이메일 내용에 추가하십시오.

이것은 서로 다른 열에 대해 별도의 필드가있는 사용자 지정 개체를 만드는 단일 문자열 작성을 대체하는 데이터 수집에 의존합니다.

예 (불완전하지만, 당신에게 아이디어를 줄 것이다)의 라인을 따라 참조 기능이 이미 정의되어

$serverData = $serverList | Foreach-Object { GetServerData $_ } | 
    Format-Table Name, 
       @(l='Boot Time'; e={$_.BootTime.ToLocalTime()}}, 
       @(l='Uptime'; e={FormatUptime([DateTime]::UtcNow - $_.BootTime}} | 
    Out-String 

$emailBody += $serverData 

:

function GetServerData { 
    params([string]$name) 

    $os = Get-WmiObject -Class Win32_OperatingSystem -Computer $name 
    $bootTimeLocal = $os.ConvertToDateTime($os.LastBootUpTime) 

    new-object PSObject -property @{ 
    Name = $name; 
    # Keep everything in UTC to avoid confusion in calcs, 
    # TODO FIX: Use the remote machine's timezone for this.... 
    BootTime = $bootTimeLocal.ToUniversalTime() 
    } 
} 

function FormatUptime { 
    params([TimeSpan]$time) 

    ... 
} 

을 요약 :

  • Format-* cmdlet을 사용하여 형식을 지정하고 출력에 즉시 전달하지 않는 경우 (이없는 모든 파이프 라인의 끝에 추가 된 기본값 Out-Default) Out-String이있는 문자열로 변환하십시오.
  • 데이터 유형을 가능한 한 원시 유형으로 유지하십시오. 필요할 때까지 사람이 읽을 수있는 형식으로 변환하지 마십시오. 따라서 정보는 손실되지 않습니다.
  • 사용자 지정 개체 및 속성 (특히 NoteProperties)을 사용하여 관련 정보를 함께 보관하는 고유 한 개체 "유형"을 만듭니다.
관련 문제