Pingの結果をPowerShellっぽく取得してみる

| 2010年11月30日火曜日
PowerShellからPing打つことはもちろんできるが、バッチファイルの中で利用すると結果が一々コンソールに出力されてちょっと邪魔な時がある。

バッチファイルの中で知りたいのは、そのIPのマシンが生きているかどうかなので、結果は「True」か「False」で十分だ。

そこで、Pingの結果をラップしてPowerShellで扱いやすいようにしてみる。

■使い方
> Get-PingResult www.google.com #成功時
Value Reply
----- -----
True {www.l.google.com [66.249.89.104]に ping を送...

> $a = Get-PingResult www.google.com #変数に入れてみる
> $a.Reply
www.l.google.com [66.249.89.104]に ping を送信しています 32 バイトのデータ:
66.249.89.104 からの応答: バイト数 =32 時間 =19ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =21ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =19ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =20ms TTL=57
66.249.89.104 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 19ms、最大 = 21ms、平均 = 19ms

> Get-PingResult www.google.coma #失敗時
Value Reply
----- -----
False ping 要求ではホスト www.google.coma が見つかり...

  1. function Get-PingResult([String]$IP) {
  2.  $reply = C:\Windows\System32\PING.EXE $IP
  3.  #余分な空白行を削除する
  4.  $reply = $reply | % { if ($_ -ne "") { $_ }}
  5.  #上手くいったかどうかは結果の行数で判断する
  6.  $success = 9
  7.  $result = New-Object psobject
  8.  if ($reply.Length -eq $success) {
  9.   $result | Add-Member -MemberType NoteProperty -Name "Value" -Value $true
  10.  } else {
  11.   $result | Add-Member -MemberType NoteProperty -Name "Value" -Value $false
  12.  }
  13.  $result | Add-Member -MemberType NoteProperty -Name "Reply" -Value $reply
  14.  return $result
  15. }

PowerShellで文字列をバイトで区切って切り出す

|
メールの本文を生成する場合などに、きれいにフォーマットするためスペースなどで埋めたり、文字数でカットして成形したい時がある。
ただ、PowerShellだと、半角の「ABCD」というのと、全角の「ABCD」はおなじ4文字としてカウントされる。
そこでVBのLeftBのようにバイト数で切り取ってみる。

■使い方
> Get-SubStringBytes "ABCD" 2 2 #半角文字を2バイト目から2バイト切り取る
CD
> Get-SubStringBytes "ABCD" 2 2 #全角文字を・・・(略)
  1. function Get-SubStringBytes([String]$Text, [int]$StartIndex = 0, [int]$Length = 0) {
  2. $enc = [System.Text.Encoding]::Default
  3. $bytes = $enc.GetBytes($Text)
  4. return $enc.GetString($bytes, $StartIndex, $Length)
  5. }

PowerShellでユーザー一覧に利用可能か無効を付けて出力する

|
Windowsのサーバー管理をしていると、突然に利用しているユーザーの一覧を提出するように求められることがある。

そんな時、慌ててGUIの管理ツールからユーザー一覧をCSV形式やなんかでエクスポートすると、削除せずに無効にしているユーザーまで出力されてしまい、そのユーザーが現在利用可能かどうかなどの状態情報は出力されないので後で指摘されることがある。

そこで、現在利用可能か無効かの情報も一緒にユーザー一覧に付けて出力してみる。

> Get-WmiObject Win32_UserAccount | Select-Object -Property Status, Name, FullName, Description

Status    Name      FullName  Description
------    ----       --------   -----------
Degraded   Administrator         コンピュータ/ドメイン...
Degraded  Guest               コンピュータ/ドメイン...
OK      ユーザー名

利用可能なユーザーは「Status」が「OK」になっている。