HIRO's.NET Blog

PowerShellが好き

目次

Blog 利用状況

ニュース

あわせて読みたい

書庫

日記カテゴリ

リンク

2008年3月24日 #

ご挨拶とご報告

この度、わたくしHIROはわんくま同盟を脱退させていただきました。

 

理由は長年の夢であった独自ドメインを取得したことにあります。

HIRO's.NETは2002年に立ち上げし、場所を転々としながらやってきました。

ついに重い腰を上げ、独自ドメインを取得し、そちらでやっていくこととしました。

わんくまと独自ドメインの両方を維持していくことは難しく、新しい方ですすめて行きたいと思います。

HPの移行が完了し、新ドメインのほうで公開を開始しております。

 

HIRO's.NET http://hiros-dot.net

HIRO's.NET Blog http://techbank.jp/Community/blogs/hiro

 

相互リンク張られていただいている方には、個々にリンク差し替えのお願いメールを送信させていただきたいと思います。

 

最後に

これまで通り、わんくまBlogを毎日拝見させていただきますし、コメントもさせていただきたいと思います。

今まで通り変わらぬお付き合いをしていただけたらと思いますので今後ともよろしくお願いいたします。

 

HIRO

posted @ 13:02 | Feedback (10)

2008年3月20日 #

Windows Server 2008 へ PowerShell をインストールする

Windows Server 2008 の評価版がダウンロード可能になったことを受けて、Standardエディションをインストールしてみました。

デフォルトではPowerShellはインストールされていません。

今回はWindows Server 2008 ServerにPowerShellをインストールする手順を紹介します。

 

まずはWindows Server 2008のインストールが完了したらWindows Updateを実行し、必ず最新の状態にしてから進めてください。

 

ここから先はWindows Updateが完了したWindows Server 2008でのPowerShellのインストール手順です。

 

1)「初期構成タスク」を起動し、「このサーバーのカスタマイズ」から「機能の追加」をクリックします。

Image1

 

2)「機能の追加ウィザード」が表示されるので、一覧から「Windows PowerShell」にチェックを付け[次へ(N)]をクリックします。

Image2

3)あとはインストールが完了するのを待ちます

Image5

4)インストールが完了すると、[スタート]-[すべてのプログラム]-[Windows PowerShell 1.0] から Windows PowerShell を起動することができるようになります。

Image7


posted @ 13:24 | Feedback (0)

2008年3月11日 #

Xmlドキュメントを作成する(PowerShell Tips)

PowerShell を使用して一からXmlDocumentを作成する手順を紹介します。

Step1
はじめにXmlDocumentを作成します

PS C:\Work> $XmlDoc = New-Object System.Xml.XmlDocument
PS C:\Work> $XmlDoc.GetType()

Step2
XML宣言ノード を作成するにはXmlDeclaretionクラスを使用します。

PS C:\Work> [System.Xml.XmlDeclaration]$XmlDecl = $XmlDoc.CreateXmlDeclaration("1.0","UTF-8",$Null) 

Step3
ルート要素を追加する

PS C:\Work> $rootElement = $XmlDoc.CreateElement("personal_data")

Step4
子要素を追加する
まず、子要素を作成する

PS C:\Work> $zipElement = $XmlDoc.CreateElement("zip")

Step5
子要素の値を設定する

PS C:\Work> $zipValue = $xmlDoc.CreateTextNode("012-3456")
PS C:\Work> $zipElement.AppendChild($zipValue)

Step6
子要素をルート要素に追加する

PS C:\Work> $rootElement.AppendChild($zipElement)
#text
-----
012-3456 

Step7
必要な子要素分だけStep4~Step6を繰り返します。

Step8
ルート要素をDOMドキュメントに追加する

PS C:\Work> $xmlDoc.AppendChild($rootElement) 
zip
---
012-3456 

Step9
作成したドキュメントをファイルに保存する

PS C:\Work> $XmlDoc.Save("C:\Work\Test.xml")

 

PowerShellでXmlDocumentを作成したくなったら参考にしてください。


posted @ 14:17 | Feedback (0)

2008年3月6日 #

Encodingを指定してXMLファイルを作成する その2(PowerShell Tips)

Encodingを指定してXMLファイルを作成する(PowerShell Tips) で紹介した方法で、文字列からXMLファイルを作成すると、インデントと改行がされないことをお伝えしました。

ということで、今回は前回の手順に+αすることで、改行とインデントがされるようにしてみたいと思います。

まずは前回の手順どおりにXmlTextWriterまで作成します。

PS C:\Work> $SaveFile = "C:\Work\UTF8.xml"
PS C:\Work> $Encoding = [System.Text.Encoding]::UTF8
PS C:\Work> $strXml = @"
>> <?xml version='1.0' encoding='utf-8' ?>
>> <personal_data>
>> <zip_code>012-3456</zip_code>
>> <address>1-1,Tokyo,Japan</address>
>> <name>HIRO</name>
>> </personal_data>
>> "@
>> PS C:\Work> $xmlDoc = [xml]$strXml PS C:\Work> $XmlWriter = New-Object System.Xml.XmlTextWriter($SaveFile, $Encoding)

で、今回のポイントはここからです

PS C:\Work> $XmlWriter.Formatting = [System.Xml.Formatting]::Indented
PS C:\Work> $XmlWriter.Indentation = 4

XmlTextWriter のFormattingプロパティに Indentedを指定することで、作成するXmlドキュメントでインデントがされるようになります。

また、XmlTextWriter の Indentation プロパティを使用することでインデント幅を指定することができます。

上記の場合はインデント幅は空白4つ分です。

あとは、ドキュメントを保存して、XmlTextWriterを閉じておしまいです。

PS C:\Work> $xmlDoc.Save($xmlWriter)
PS C:\Work> $XmlWriter.Close()

作成されたドキュメントは下記のように改行とインデントがされています。

<xml version='1.0' encoding='utf-8'?>
<personal_data>
    <zip_code>012-3456</zip_code>
    <address>1-1,Tokyo,Japan</address>
    <name>HIRO</name>
</personal_data>

posted @ 14:09 | Feedback (0)

2008年3月5日 #

インストール済みアプリを取得する

インストールされているアプリの一覧を取得するにはWMIオブジェクトの win32_product を使用します。

Get-WmiObject win32_product

リモートコンピュータのインストール済みアプリ一覧の取得は -computerName パラメータを使用して

Get-WmiObject -computerName リモートコンピュータ名 win32_product 

とします。

ただし、 win32_productは Windows VistaとWindows 2003 Server にはありません。

正確にはWindows 2003 ServerはWMIプロバイダを追加することで使用できるようになるらしいです。

OSごとに、使用可能なWMIオブジェクトが異なるのは、進化していく上で必要なことなんでしょうが.....

んー、Vistaや2003 Serverでwin32_productに代わるものってなんでしょう?


posted @ 22:33 | Feedback (0)

2008年3月4日 #

サービスのステータスごとに色をつける(PowerShell Tips)

Get-Serviceコマンドレットは、ローカル コンピュータ上のサービスを取得するコマンドレットです。
このコマンドレットの実行結果には、サービスのステータス情報("Stopped"か"Running")が含まれています。

"Stopeed"だったら文字色を赤で、"Running"だったらシアンでサービス名を表示する関数を作ってみました。

実行結果は下図のとおりです。

Color-SrvStatus

#===============================================================================
# Color-SrvStatus: サービスのステータス別に色を付ける
#
# 使用例
#   PS > Color-SrvStatus
#
# copyright HIRO's.NET(http://hiro.wankuma.com/)
#===============================================================================
function global:Color-SrvStatus
{
  #サービスを取得
  $srv = get-service
  #カウンタの初期化
  $iCnt = 0
  
  for ( $iCnt = 0; $iCnt -lt $srv.length; $iCnt++ )
  {
      #各サービスのステータスを判断して色を付ける
      if ($srv[$iCnt].status -eq "running") 
        {write-host $srv[$iCnt].Name -foregroundcolor "cyan"}
      elseif ($srv[$iCnt].status -eq "stopped") 
        {write-host $srv[$iCnt].Name -foregroundcolor "red"}
      else                                      
        {write-host $srv[$iCnt].Name}
      $iCnt++
  }
}

 

ポイント
といっても、なんのことはありません。
取得結果のStatusを判断して、色を付けています。
この関数はサービス名しか表示しないので、用途に合わせて表示される情報を増やすことをおすすめします。


posted @ 14:31 | Feedback (0)

Encodingを指定してXMLファイルを作成する(PowerShell Tips)

文字列からXmlDocumentを作成する(PowerShell Tips)

での Xmlファイルの作成はEncodingの指定をせずに保存しました。

今回はEncodingを指定して、保存する方法を紹介します。

 

まずは保存先ファイル名とEncodingを変数に代入します。

PS C:\Work> $SaveFile = "C:\Work\UTF8.xml"
PS C:\Work> $Encoding = [System.Text.Encoding]::UTF8

次に、前回同様ヒア文字列を使用してXML文字列を作成

PS C:\Work> $strXml = @"
>> <?xml version='1.0' encoding='utf-8' ?>
>> <personal_data>
>> <zip_code>012-3456</zip_code>
>> <address>1-1,Tokyo,Japan</address>
>> <name>HIRO</name>
>> </personal_data>
>> "@
>>

で、これをXmlDocument型にキャストしておきます。

PS C:\Work> $xmlDoc = [xml]$strXml

で、前回はここで$XmlDoc.Save()メソッドを実行したのですが、ここでXmlTextWriterを作成します。

こうすることでEncodingを指定できます。

PS C:\Work> $XmlWriter = New-Object System.Xml.XmlTextWriter($SaveFile, $Encoding)

で、保存して、XmlTextWriterを閉じます。

PS C:\Work> $xmlDoc.Save($xmlWriter)
PS C:\Work> $xmlWriter.Close()

実際にファイルを開いてみると、utf-8で有ることが確認できます。(下図はサクラエディタで開いたものです)

utf8 

 

最後に、上記を応用して、Shift_Jisで保存してみたいと思います。

PS C:\Work> $SaveFile = " ps c:\Work\Shift_Jis.xml? c:\Work>$encoding = [System.Text.Encoding]::GetEncoding("Shift_Jis")
PS C:\Work> $xmlDoc = [xml]$strXml
PS C:\Work> $XmlWriter = New-Object System.Xml.XmlTextWriter($SaveFile, $Encoding)
PS C:\Work> $xmlDoc.Save($xmlWriter)
PS C:\Work> $xmlWriter.Close()

作成したXmlファイルはShift_Jisであることが確認できます。

shift_jis

注意事項が2点あります。

1つ目はEncodingです。

UTF8のときと違って、Shift_Jistは

$encoding = [System.Text.Encoding]::Shift_Jis

とすることができません。

GetEncodingメソッドを使用して

[System.Text.Encoding]::GetEncoding("Shift_Jis")

とする必要があります。

2つ目は、Xmlファイルが改行されずに1行になってしまっていることです。

前回の方法で保存したものは改行および自動インデントがされました)

これについては、次回以降で説明したいと思います。


posted @ 9:47 | Feedback (1)

2008年3月3日 #

指定した年月のカレンダーを表示する その2(PowerShell Tips)

ちょっと仕事も飽きてきたので息抜きに

指定した年月のカレンダーを表示する の色つき版を作ってみました。

実行結果は下記の下段のほうです。

上段のほうは、前回の実行結果です。

Get-Calendar2

以下ソース

Get-Calendar2.ps1

#===============================================================================
# Get-Calendar2: 指定した年月のカレンダーを表示する(色つき版)
#
# パラメータ:
#       $Year: 年(省略した場合は現在の年)
#      $Month: 月(省略した場合は現在の月)
#
# 使用例1(年月指定)
#   PS > Get-Calendar2 2008 2
#
# 使用例2(年月省略)
#   PS > Get-Calendar
#
# copyright HIRO's.NET(http://hiro.wankuma.com/)
#===============================================================================
function global:Get-Calendar2
{
  Param ([int]$Year = $(Get-Date).Year, [int]$Month =  $(Get-Date).Month)
  
  #表示用年月作成
  $DispMonth = New-Object DateTime($Year, $Month, 1)
  $strDispMonth = ($DispMonth.ToString("MMMM",[System.Globalization.CultureInfo]'en-US') + " " + $Year)
  #横幅35文字の中間に表示されるようにする
  Write-Host ""
  Write-Host $strDispMonth.PadLeft([int](35 - (35 - $strDispMonth.Length) / 2))
  
  $firstSunday = Get-FirstSunday $Year $Month
  $lastDay = Get-LastDay $Year $Month
  Write-Host "Sun." -foregroundcolor Red -noNewline
  Write-Host " Mon. Tue. Wed. Thu. Fri. " -noNewline
  Write-Host "Sat." -foregroundcolor Cyan
  
  # 第1日曜日が"1日"以外の第1週を表示
  if ( $firstSunday -ne 1 )
  {
    for ( $i = 1; $i -lt $firstSunday - 1; $i++ )
    {
      $week += $i.ToString("  #  ")
    }
    $spc = "     "
    $spc *= [int](7 - ( $firstSunday - 1 ))
    Write-Host ($spc + $week) -noNewline
    #土曜日をCyanにする
    Write-Host ($firstSunday - 1).ToString("  #  ") -foregroundcolor Cyan
  }
  
  #中間週を表示
  $loopWeek = [Math]::floor(($LastDay - $firstSunday) / 7)
  $Day = $firstSunday
  for ( $weekCnt = 0; $weekCnt -lt $loopWeek; $weekCnt++ )
  {
    for ( $iDay = 0; $iDay -lt 7; $iDay++ )
    {
      if ( $Day -lt 10 ) { $strDay = $Day.ToString("  #  ") }
      else               { $strDay = $Day.ToString(" ##  ") }
      
      #日曜日はRed, 土曜日はCyanにする
      if ($iDay -eq 0 )     { Write-Host $strDay -foregroundcolor Red -noNewline }
      elseif ($iDay -eq 6 ) { Write-Host $strDay -foregroundcolor Cyan}
      else                  { Write-Host $strDay -noNewline }
      $Day += 1
    }
    #Write-Host ($week)
  }
  
  #最終週を表示
  if ( $Day -le $LastDay )
  {
    $week = ""
    $LastSunday = $Day
    $Day += 1
    for ( $iDay = $Day; $iDay -le $LastDay - 1; $iDay++ )
    {
      $week += $Day.ToString(" ##  ")
      $Day += 1
    }
    
    #最終週の日曜日の色をRedにする
    Write-Host $LastSunday.ToString(" ##  ") -foregroundcolor Red -noNewline
    Write-Host $week -noNewline
    
    #最終日が土曜日の場合は色をCyanにする
    if ($LastDay - $LastSunday -eq 6) { Write-Host $LastDay.ToString(" ##  ") -foregroundcolor Cyan }
    else                              { Write-Host $LastDay.ToString(" ##  ") }
  }
}

 

ポイントは

Write-Hostコマンドレットで色を付けているということです。

前景色(文字色)はパラメータ -foregroundcolor で指定することができます。

指定可能な色は

  • Black
  • DarkBlue
  • DarkGreen
  • DarkCyan
  • DarkRed
  • DarkMagenta
  • DarkYellow
  • Gray
  • DarkGray
  • Blue
  • Green
  • Cyan
  • Red
  • Magenta
  • Yellow
  • White

です。

あとは むたぐちさんに Write-Hostコマンドレットは、-noNewlineパラメータを使用すれば改行しないで文字を出力できることを教えていただきましたので、それを使用しました。

 

にしても、コードが汚すぎますね..orz

後できれいにしたいと思います。(「します」じゃないところがミソ)


posted @ 16:56 | Feedback (0)

文字列からXmlDocumentを作成する(PowerShell Tips)

今回は文字列からXmlDocumentを作成して、ファイルに保存する方法を紹介します。

まずは、以下のようにしてXML文字列を作成します。

PowerShellでは複数行にわたる文字列は ヒア文字列を使用することであらわすことができます。

ヒア文字列は@" ~ "@ で表します。

PS C:\Work> $strXml = @"
>> <?xml version='1.0' ?>
>> <personal_data>
>> <zipcode>012-3456</zipcode>
>> <address>1-1, Tokyo, Japan</address>
>> <name>HIRO</name>
>> </personal_data>
>> "@
>>

 

どのような文字列が代入されたのかを確認してみると

PS C:\Work> $strXML

<?xml version='1.0' ?>
<personal_data>
<zipcode>012-3456</zipcode>
<address>1-1, Tokyo, Japan</address>
<name>HIRO</name>
</personal_data>

きちんと改行されて代入されていることがわかります

次にこの文字列をXmlDocument型にキャストします。

PS C:\Work> $xmlDoc = [xml]$strXml

最後に、ファイルへ出力する方法ですが、Saveメソッドを使用して下記のように記述します。

PS C:\Work> $xmlDoc.Save("C:\Work\Test.xml")

で、ファイルに出力できたら、メモ帳などで内容を確認してみてください。

下記のようになっているかと思います。

Test.xml

<?xml version="1.0"?>
<personal_data>
  <zipcode>012-3456</zipcode>
  <address>1-1, Tokyo, Japan</address>
  <name>HIRO</name>
</personal_data>

インデントまで自動でしてくれます。

すばらしいですね。


posted @ 13:39 | Feedback (2)

PowerShellでXMLファイルを取り扱う(PowerShell Tips)

今週は、PowerShellでのXMLの取り扱いについてまとめていこうかと思います。

まずはXMLファイルの読み込みから。

VB.NETだとXmlDocumentは

Dim xmlDoc As New System.Xml.XmlDocument
xmlDoc.Load("C:\Work\Test.xml")

みたいに記述します。

 

PowerShellでは

[xml]$doc = Get-Content "C:\Work\Test.xml"

と書くと、変数$docにXMLファイルが読み込まれます。

これで読み込むことができるのですが、エンコーディングはきちんと指定することをお勧めします。

エンコーディングを指定する場合は、-encodingパラメータを使用します。

-encodingパラメータには、

  • Unicode
  • UTF7
  • UTF8
  • UTF32
  • ASCII
  • BigEndianUnicode
  • Default
  • OEM

を指定することができます。

UTF8で読み込む場合は

[xml]$doc = Get-Content "C:\Work\Test.xml" -encoding UTF8

のように記述します。

で、[xml]でキャストした$docのデータ型はどうなっているかというと(GetType()メソッドで確認)

PS C:\Work> $doc.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    XmlDocument                              System.Xml.XmlNode

XmlDocumentとなっていることが確認できます。

で、使用可能なメンバーは(Get-Memberコマンドレットで確認)

PS C:\Work> $doc | Get-Member


   TypeName: System.Xml.XmlDocument

Name                        MemberType            Definition
----                        ----------            ----------
ToString                    CodeMethod            static System.String XmlNode(PSObject instance)
add_NodeChanged             Method                System.Void add_NodeChanged(XmlNodeChangedEventHandler value)
add_NodeChanging            Method                System.Void add_NodeChanging(XmlNodeChangedEventHandler value)
add_NodeInserted            Method                System.Void add_NodeInserted(XmlNodeChangedEventHandler value)
add_NodeInserting           Method                System.Void add_NodeInserting(XmlNodeChangedEventHandler value)
add_NodeRemoved             Method                System.Void add_NodeRemoved(XmlNodeChangedEventHandler value)
add_NodeRemoving            Method                System.Void add_NodeRemoving(XmlNodeChangedEventHandler value)
AppendChild                 Method                System.Xml.XmlNode AppendChild(XmlNode newChild)
Clone                       Method                System.Xml.XmlNode Clone()
CloneNode                   Method                System.Xml.XmlNode CloneNode(Boolean deep)
:
たくさんあるので省略
:

このようにPowerShellでは簡単にXMLを取り扱うことが可能です。


posted @ 9:43 | Feedback (0)