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
2008年3月20日
#
Windows Server 2008 の評価版がダウンロード可能になったことを受けて、Standardエディションをインストールしてみました。
デフォルトではPowerShellはインストールされていません。
今回はWindows Server 2008 ServerにPowerShellをインストールする手順を紹介します。
まずはWindows Server 2008のインストールが完了したらWindows Updateを実行し、必ず最新の状態にしてから進めてください。
ここから先はWindows Updateが完了したWindows Server 2008でのPowerShellのインストール手順です。
1)「初期構成タスク」を起動し、「このサーバーのカスタマイズ」から「機能の追加」をクリックします。
2)「機能の追加ウィザード」が表示されるので、一覧から「Windows PowerShell」にチェックを付け[次へ(N)]をクリックします。
3)あとはインストールが完了するのを待ちます
4)インストールが完了すると、[スタート]-[すべてのプログラム]-[Windows PowerShell 1.0] から Windows PowerShell を起動することができるようになります。
2008年3月11日
#
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を作成したくなったら参考にしてください。
2008年3月6日
#
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>
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に代わるものってなんでしょう?
2008年3月4日
#
Get-Serviceコマンドレットは、ローカル コンピュータ上のサービスを取得するコマンドレットです。
このコマンドレットの実行結果には、サービスのステータス情報("Stopped"か"Running")が含まれています。
"Stopeed"だったら文字色を赤で、"Running"だったらシアンでサービス名を表示する関数を作ってみました。
実行結果は下図のとおりです。
#===============================================================================
# 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を判断して、色を付けています。
この関数はサービス名しか表示しないので、用途に合わせて表示される情報を増やすことをおすすめします。
での 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で有ることが確認できます。(下図はサクラエディタで開いたものです)
最後に、上記を応用して、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であることが確認できます。
注意事項が2点あります。
1つ目はEncodingです。
UTF8のときと違って、Shift_Jistは
$encoding = [System.Text.Encoding]::Shift_Jis
とすることができません。
GetEncodingメソッドを使用して
[System.Text.Encoding]::GetEncoding("Shift_Jis")
とする必要があります。
2つ目は、Xmlファイルが改行されずに1行になってしまっていることです。
(前回の方法で保存したものは改行および自動インデントがされました)
これについては、次回以降で説明したいと思います。
2008年3月3日
#
ちょっと仕事も飽きてきたので息抜きに
指定した年月のカレンダーを表示する の色つき版を作ってみました。
実行結果は下記の下段のほうです。
上段のほうは、前回の実行結果です。
以下ソース
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
後できれいにしたいと思います。(「します」じゃないところがミソ)
今回は文字列から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>
インデントまで自動でしてくれます。
すばらしいですね。
今週は、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を取り扱うことが可能です。