-1

複数のシステムからシステムの稼働時間情報を収集し、それを電子メールで送信するPowerShellスクリプトを作成しようとしています。電子メールを適切な方法で構成し、後でシステムに関する情報を追加できるように、電子メールをフォーマットしたいと思います。

今日、私はこのスクリプトを以下に示します。このスクリプトは、システムのリストに関する稼働時間情報を収集し、これらの情報を配列でSendMail関数に渡します。SendMail関数には、その配列が電子メールに含まれています。ただし、現在の出力は次のようになります。

稼働時間リスト:再起動02/19/2013 04:04:52 MyServer01コンピューター稼働時間:23日9時間再起動02/15/2013 04:17:40 MyServer02コンピューター稼働時間:27日9時間

出力または電子メールテキストを次のようにしたいと思います。

システム| 再開日時| 稼働時間
MyServer01 02/17/201304:04:5225日9時間
MyServer02 02/17/201304:04:5225日9時間

電子メールのテキストをフォーマットするにはどうすればよいですか、それとも配列を電子メール関数に渡す前にフォーマットする必要がありますか。

スクリプト自体:

`

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 = "my@overtherainbow.ddd"
     $msg.ReplyTo = "noreply@overtherainbow.ddd"
     $msg.To.Add("my@overtherainbow.ddd")
     $msg.subject = "System uptime"
     $msg.body = ("List og servers and uptime:" + $arg1 )

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


function CheckUptime($listofservers){
    $k =@()
    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)

`

4

2 に答える 2

2

第 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 
于 2013-03-14T14:24:57.727 に答える
2

必要に応じてデータをフォーマットするために使用Format-Tableし、それを にパイプしてOut-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-*してフォーマットし、すぐに出力に渡さない場合 (およびOut-Defaultなしですべてのパイプラインの最後に追加されたデフォルトOut-*)、 を使用して文字列に変換しますOut-String
  • データ型を可能な限りネイティブ型のままにします。必要になるまで、人間が読める形式に変換しないでください。したがって、情報は失われません。
  • カスタム オブジェクトとプロパティ (特に NoteProperties) を使用して、独自のオブジェクト「タイプ」を作成し、関連情報をまとめます。
于 2013-03-14T14:34:02.703 に答える