2010年12月9日木曜日

◆カスタムオブジェクト(PsObject)を使う(New-Object)

PowerShell: ◆Pingでサーバーの死活確認(Test-Connection)ではCSV経由でオブジェクトを作りHTML化していたが、CSVの代わりに独自のオブジェクト(いわゆるマイオブジェクト)を使ってみる。
C#でクラスを作ってインスタンシングしても良いのだが、ここではPowershellだけでやって見る。
独自のオブジェクトを作るにはPsObject(正式にはPsCustomObjectか?)のインスタンスを作り、それにメンバーを追加していけば良さそうだ。

メンバーの追加はPowerShell: ◆オブジェクトにプロパティを追加する(Add-Member)でもやっているので特に目新しいことは無い。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
New-Object psobject |
  Add-Member -Name Pc名 -type NoteProperty -Value $pcname[$_] -PassThru |
  Add-Member -Name IsAlive -type NoteProperty -Value $isalive[$_] -PassThru
 
}

$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

ちなみに、メンバーの追加はAdd-Memberの代わりにハッシュテーブルにして一度に与えても良い。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
$hash = @{}
  $hash.PC名 = $pcname[$_]
  $hash.isalive = $isalive[$_]
  New-Object pscustomobject -Property $hash
}
$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

参考までにハッシュテーブルは文字列で定義しておいてConvertFrom-StringDataコマンドレットで変換して作ることも出来る。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
$hashstring = 
@"
   PC名 = $($pcname[$_])
   isalive = $($isalive[$_])
"@

  $hash = ConvertFrom-StringData($hashstring
)
 
New-Object pscustomobject -Property $hash
}
$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

0 件のコメント:

コメントを投稿