<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>荒井省三のBlog : PowerShell</title><link>http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx</link><description>Tags: PowerShell</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>[PS]PowerShellリモーティング</title><link>http://blogs.msdn.com/shozoa/archive/2008/01/22/powershell.aspx</link><pubDate>Tue, 22 Jan 2008 10:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7194704</guid><dc:creator>shozoa</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/7194704.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=7194704</wfw:commentRss><description>&lt;P&gt;PowerShell2.0CTPでは、PowerShellリモーティングなるものが提供されています。リモーティングの言葉通り、リモートコンピュータのPowerShellを手元のPowerShellから操作する機能です。このPowerShellリモーティングを使用するには、以下のような前提条件があります。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Windows XP/Windows Server 2003&lt;BR&gt;&lt;A href="http://go.microsoft.com/fwlink/?linkid=100350" target=_blank mce_href="http://go.microsoft.com/fwlink/?linkid=100350"&gt;Windows Remote Management&lt;/A&gt;が必要になります。 
&lt;LI&gt;Windows Vista&lt;BR&gt;SP1が必要になります。現在公開されているRCで問題はありません。 
&lt;LI&gt;Windows Server 2008&lt;BR&gt;特に必要なものはありません。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Windows Remote Management(WinRM)の最新版があれば、PowerShellリモーティングを動作させることができます。WinRMとは、WS-ManagementというSOAPベースのプロトコルを使った管理用プロトコルのWindows実装です。WinRMは、Windows Vistaには標準で含まれているのですが、PowerShell2.0で使用するには更新されたバージョンが必要になるのです。&lt;BR&gt;　この準備ができたらPowerShell2.0CTPをインストールしてから、WinRMの設定を行います。設定方法は、PowerShell2.0CTPのリリースノートに記載されている通りで、1)WinRMサービスの起動、2)$PSHome\Configure-Wsman.ps1スクリプトの実行の2つです。&lt;/P&gt;
&lt;P&gt;　実際の使い方は、2種類あります。1つ目は、以下の通りです。&lt;BR&gt;&lt;PRE&gt;PS (1) &amp;gt;Invoke-Exparession hostname -ComputerName コンピュータ名
&lt;/PRE&gt;&lt;BR&gt;Invoke-ExpressionにComputerNameパラメータを指定することで、指定したコンピュータ上のPowerShell2.0でhostnameコマンドを実行して、結果をコンソールに表示します。2つ目の方法は、Runspaceオブジェクトを指定します。&lt;BR&gt;&lt;PRE&gt;PS (2) &amp;gt;$remote = New-Runspace -ComputerName コンピュータ名
PS (3) &amp;gt;Invoke-Exparession hostname -Runspace $remote&lt;/PRE&gt;&lt;BR&gt;New-Runspaceを使ってコンピュータ名に対応したRunspaceオブジェクトを作成します。このRunspaceオブジェクトを指定してコマンドレットを実行するだけです。&lt;BR&gt;つまりPowerShellリモーティングに対応したコマンドレットとは、ComputerNameパラメータとRunspaceパラメータを指定できるように拡張されたコマンドレットであると言えます。この意味で、前回にご紹介したバックグラウンドジョブ(Start-PSJob)などもリモーティングで使用することができます。&lt;BR&gt;　このPowerShellリモーティングは、WinRMのエンドポイントとしてPowerShell.exeを登録しています(この設定が、Configure-Wsman.ps1で行っています)。ですので、IISのようなHTTPサーバーを必要としないのです。また、ComputerNameパラメータには、コンピュータ名を配列で指定することができます。つまり1:Nの通信を行うことができるのです。よって、リモートコンピュータの管理という面では便利かなと私は思っています。&lt;BR&gt;　内部的な動作としては、RemoteRunspaceオブジェクトを作成して、このRemoteRunspaceの中でコマンドレットを実行しています。そしてComputerNameパラメータを指定した場合は、一時的なRemoteRunspaceオブジェクトを作成してコマンドを実行するようになっています。&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7194704" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[PS] 2.0の国際化対応機能</title><link>http://blogs.msdn.com/shozoa/archive/2008/01/19/ps-2-0.aspx</link><pubDate>Sat, 19 Jan 2008 08:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7157391</guid><dc:creator>shozoa</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/7157391.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=7157391</wfw:commentRss><description>&lt;P&gt;　PowerShell2.0でスクリプトの国際化機能が追加されています。どのような機能かと云えば、変数に格納するデータを言語識別子フォルダ(ja-JP、en-USとか)に格納しておくことで、UICultuteによって自動的に適用するデータを選択するというものです。&lt;BR&gt;&lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/c43e0703d479_D15A/%E5%9B%B312.%20%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0_2.png" mce_href="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/c43e0703d479_D15A/%E5%9B%B312.%20%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=109 alt="図12. 国際化のフォルダ構造" src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/c43e0703d479_D15A/%E5%9B%B312.%20%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0_thumb.png" width=244 border=0 mce_src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/c43e0703d479_D15A/%E5%9B%B312.%20%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;具体例を使って説明しましょう。以下に実行したいスクリプトファイル（world.ps1）を示します。&lt;BR&gt;&lt;PRE&gt;# 変数msgTableのデフォルト定義
Data msgTable {
   ConvertFrom-StringData @'
      helloWorld = Hello, World
      errorMsg = You cannot leave the username field blank.
      promptMsg = Please enter your username.
'@
}
param ($language)
Import-LocalizedData -BindingVariable msgTable -Culture $language
$msgTable
&lt;/PRE&gt;&lt;BR&gt;次に日本語のデータを定義したファイル(world.psd1)をja-JPフォルダに配置します。&lt;BR&gt;&lt;PRE&gt;ConvertFrom-StringData @'
      helloWorld = こんにちは。
      errorMsg = ユーザー名は空白にできません。
      promptMsg = ユーザー名を入力してください。
'@
&lt;/PRE&gt;&lt;BR&gt;更に内容を英語にしたファイル(world.psd1)をen-USフォルダに配置します。そして以下のように実行するとカルチャによってデータの内容が切り替わります。&lt;BR&gt;&lt;PRE&gt;PS (1) &amp;gt;.\world ja-JP  #日本語を指定

Name　　　　　　　　　Value
----　　　　　　　　　-----
promptMsg　　　　　　　ユーザー名を入力してください。
helloWorld　　　　　　　こんにちは。
errorMsg　　　　　　　　ユーザー名は空白にできません。

PS (2) &amp;gt;.\world en-US  #英語を指定

Name　　　　　　　　Value
----　　　　　　　　-----
promptMsg　　　　　　　Please enter your username.
helloWorld　　　　　　　Hello, World
errorMsg　　　　　　　　You cannot leave the username field blank.
&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;指定したカルチャによって、データの内容が切り替わっているのを確認することができます。PowerShell 2.0では、現在のカルチャを判断するために$UICultureシェル変数が追加されています。それでは、ここまでに出てきた新しいキーワードやコマンドレットを説明していきます。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Dataキーワード&lt;BR&gt;指定した変数名にスクリプトブロックの実行結果を格納するデータ定義用のキーワードです。スクリプトブロックには、ConverFrom-StringDataコマンドレットの他にif文や一部のシェル変数を利用することができます。&lt;/LI&gt;
&lt;LI&gt;ConverFrom-StringDataコマンドレット&lt;BR&gt;文字列で指定した「名前=値」のペアからハッシュテーブルを作成するコマンドレットです。&lt;/LI&gt;
&lt;LI&gt;Import-LocalizedDataコマンドレット&lt;BR&gt;指定した変数に$UICultureに一致するデータファイルの内容を設定します。実際の動作は、Dataキーワードと同じで、データファイルの中身がスクリプトブロックの中身となります。&lt;/LI&gt;
&lt;LI&gt;デフォルトのデータ&lt;BR&gt;スクリプトファイルの中に記述したDataキーワードがデフォルトの値となります。が、Import-LocalizedDataコマンドレットを指定する場合は、すべてのデータが言語識別サブフォルダに無ければなりません。つまりスクリプトファイル中のDataキーワードは、意味がなくなります。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;このような記述を行うことで変数定義をまとめたり、ローカライズをできるようにしたのが、PowerShell2.0の国際化対応となります。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7157391" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[PS] 2.0におけるWMIの機能強化</title><link>http://blogs.msdn.com/shozoa/archive/2008/01/17/ps-2-0-wmi.aspx</link><pubDate>Thu, 17 Jan 2008 11:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7140503</guid><dc:creator>shozoa</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/7140503.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=7140503</wfw:commentRss><description>&lt;P mce_keep="true"&gt;　PowerShell 2.0では、WMI関係の機能強化が行われています。どのような機能強化かと云えば、以下のようなものがあります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Get-WmiObject：Impersonation（偽装）などのパラメータが追加された。 
&lt;LI&gt;Invoke-WmiMethod：WMIクラスのメソッドを呼び出す機能。 
&lt;LI&gt;Remove-WmiObject：WMIオブジェクトの削除。 
&lt;LI&gt;Set-WmiInstance：WMIクラスのインスタンスの作成。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;　この中から、Invoke-WmiMethodとRemove-WmiObjectをご紹介します。最初にサンプルのコードを以下に記述します。&lt;BR&gt;&lt;PRE&gt;PS (1) &amp;gt;$note = Invoke-WMIMethod -Path Win32_Process -Name create -Argumentlist notepad.exe
PS (2) &amp;gt;$note


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ProcessId        : 4720
ReturnValue      : 0

PS (3) &amp;gt;$ps = Get-WMIObject Win32_Process
PS (4) &amp;gt;$ret = $ps | Where-Object { $_.ProcessId -eq $note.ProcessId }
PS (5) &amp;gt;Remove-WMIObject -InputObject $ret
&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;　1行目のInvoke-WmiMethodでは、WMIのWin32_ProcessクラスのCreateメソッドに引数として「notepad.exe」を指定しています。これで何が行われるかと云えば、メモ帳の起動（インスタンスの作成）が行われます。そして、戻り値からプロセスIDを取得することができます。&lt;BR&gt;　3行目でWin_Processクラスのインスタンスのコレクションを取得します。そして4行目で、1行目で起動したメモ帳のWMIオブジェクトを取得します（もちろん、3行目でWMIクエリーで取得する方法もあります）。&lt;BR&gt;　5行目のRemove-WmiObjectでメモ帳のWMIオブジェクトのインスタンスを削除します。つまり、プロセスを終了させるのです。&lt;/P&gt;
&lt;P&gt;　このように作成したWMIオブジェクトのインスタンスを自由に削除することができるように拡張がなされています。&lt;BR&gt;#この例を実行するには管理者権限が必要になります（Remove-WmiObjectが管理者権限を必要とします）」。&lt;BR&gt;#&lt;A class="" href="http://blogs.msdn.com/shozoa/archive/2007/10/02/ps-wmi.aspx" mce_href="http://blogs.msdn.com/shozoa/archive/2007/10/02/ps-wmi.aspx"&gt;以前のエントリ&lt;/A&gt;で説明したWin32_ProductクラスはVista SP1で解決されています。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7140503" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[PS]バックグランド ジョブ</title><link>http://blogs.msdn.com/shozoa/archive/2008/01/09/ps.aspx</link><pubDate>Wed, 09 Jan 2008 09:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7037106</guid><dc:creator>shozoa</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/7037106.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=7037106</wfw:commentRss><description>&lt;P&gt;新年、明けましておめでとうございます。&lt;BR&gt;ご存じの方も多いと思いますが、&lt;A href="http://www.microsoft.com/technet/scriptcenter/topics/winpsh/pshell2.mspx" mce_href="http://www.microsoft.com/technet/scriptcenter/topics/winpsh/pshell2.mspx"&gt;PowerShell v2&lt;/A&gt;のCTPが2007年11月に公開されています。今回は、v2で追加されたバックグラウンド ジョブに関して記述したいと思います。バックグラウンド ジョブは、文字通りバックグラウンドでコマンドを実行する機能です。この機能に関連したコマンドレットとして、以下が提供されています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Start-PSJob(ジョブの追加と開始)&lt;/LI&gt;
&lt;LI&gt;Get-PSJob(ジョブの取得)&lt;/LI&gt;
&lt;LI&gt;Remove-PSJob(ジョブの削除)&lt;/LI&gt;
&lt;LI&gt;Wait-PSJob(ジョブの一時停止)&lt;/LI&gt;
&lt;LI&gt;Receive-PSJob(ジョブの実行結果の取得)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;使い方は簡単で、「Start-PSJob -Command "コマンド文字列"」を実行することでバックグラウンドジョブが開始されます。Start-PSJobは、PSRemotingJobのインスタンスを返します。このPSJobのインスタンスを取得するのが、Get-PSJobコマンドレットになります。&lt;BR&gt;　実行を開始したPSJobはバックグラウンドで動作しますので、結果を受け取るのに「Receive-PSJob -InputObject $PSJob」を実行します。これでコンソールに実行結果を受け取ることができます。&lt;BR&gt;　PSJobが、PSRemotingJobのインスタンスである点に注意してください。何故なら、v2からPowerShell Remoting(Windows Remote Managementが必須、VistaではSP1が必須)が導入されており、リモートのコンピュータに対する操作をバックグラウンドでできるようになっているからです。それとPowerShellのコマンド実行は、Runspaceオブジェクトのインスタンスを使って実行しますので、バックグラウンドジョブはテンポラリのRunspaceオブジェクトを作成して利用しています。オプションで独自のRunspaceオブジェクト(New-Runspaceコマンドレット)を指定することもできます。&lt;BR&gt;　このバックグランドジョブですが、現時点では管理者権限が必須のようです。一般ユーザー権限で実行したところ、実行が失敗するので管理者権限で試したら、正常に動作しました。&lt;/P&gt;
&lt;P&gt;　PowerShell v2 CTPを試される場合に注意していただく点が、2つあります。1つ目は、PowerShell1.0の置き換えになることです。このためインストール前に、PowerShell 1.0をアンインストールする必要があります。最後は、ヘルプに関してです。v2 CTPは英語版のため、日本語OSではヘルプを表示することができません。このため「地域と言語」を英語に設定していただくか、$PSHome\en-USフォルダをja-JPフォルダにリネームしていただく必要があります。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7037106" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[PS] PowerShellの書籍がまもなく発売になります</title><link>http://blogs.msdn.com/shozoa/archive/2007/12/05/ps-powershell.aspx</link><pubDate>Wed, 05 Dec 2007 05:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6660804</guid><dc:creator>shozoa</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/6660804.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=6660804</wfw:commentRss><description>&lt;P&gt;Blogの更新も滞っていたのは、プライベートでも忙しかったためです。長期に渡ってプライベートの時間でPowerShellの書籍を執筆していました。この書籍もやっと最終局面に入ってきて、残すは最後のチェック作業のみになりました。私は気がつかなかったのですが、Amazonに予約販売で掲載されていました。&lt;BR&gt;&lt;A href="http://www.amazon.co.jp/exec/obidos/ASIN/4774133329/" target=_blank mce_href="http://www.amazon.co.jp/exec/obidos/ASIN/4774133329/"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=244 alt=PowerShell src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/PSPowerShell_9B58/PowerShell_3.png" width=168 border=0 mce_src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/PSPowerShell_9B58/PowerShell_3.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;タイトル:プログラマブル PowerShell&amp;nbsp; ～プログラマのための活用バイブル～&lt;BR&gt;出版社:&lt;A href="http://www.gihyo.co.jp/" target=_blank mce_href="http://www.gihyo.co.jp/"&gt;技術評論社&lt;/A&gt;&lt;BR&gt;ISBN:4774133329&lt;BR&gt;価格：2480円(税抜き)&lt;BR&gt;発売予定日:2008/1/9&lt;/P&gt;
&lt;P&gt;サブタイトルが「プログラマのための」となっていますが、スクリプトを記述する人向けとするために可能な限り、文法を重視して記述しました。以下に目次を掲載します。&lt;BR&gt;&lt;BR&gt;Capter1. PowerShellとは&lt;BR&gt;1.1.&amp;nbsp; PowerShellの概要&lt;BR&gt;1.2.&amp;nbsp; PowerShellの導入&lt;BR&gt;1.3.&amp;nbsp; コマンド&lt;BR&gt;1.4.&amp;nbsp; その他の機能と特徴&lt;BR&gt;1.5.&amp;nbsp; インタープリタの機能&lt;BR&gt;1.6.&amp;nbsp; まとめ&lt;BR&gt;&lt;BR&gt;Chapter2. スクリプトの開発&lt;BR&gt;2.1.&amp;nbsp; PowerShellと.NET Frameworkの関係&lt;BR&gt;2.2.&amp;nbsp; PowerShell固有の癖&lt;BR&gt;2.3.&amp;nbsp; リテラルの定義&lt;BR&gt;2.4.&amp;nbsp; 変数の定義&lt;BR&gt;2.5.&amp;nbsp; データ型&lt;BR&gt;2.6.&amp;nbsp; 演算子(オペレータ)&lt;BR&gt;2.7.&amp;nbsp; フロー制御&lt;BR&gt;2.8.&amp;nbsp; 関数&lt;BR&gt;2.9.&amp;nbsp; ファイル処理&lt;BR&gt;2.10. 例外処理&lt;BR&gt;2.11. デバッグ&lt;BR&gt;2.12. まとめ&lt;BR&gt;&lt;BR&gt;Chapter3. PowerShellの使い方&lt;BR&gt;3.1.&amp;nbsp; .NET オブジェクト&lt;BR&gt;3.2.&amp;nbsp; .NET流なファイル処理&lt;BR&gt;3.3.&amp;nbsp; 正規表現&lt;BR&gt;3.4.&amp;nbsp; GUIアプリの開発&lt;BR&gt;3.5.&amp;nbsp; インターネットにアクセスする&lt;BR&gt;3.6.&amp;nbsp; Webサービス&lt;BR&gt;3.7.&amp;nbsp; XMLを使う&lt;BR&gt;3.8.&amp;nbsp; データベースプログラミング&lt;BR&gt;3.9.&amp;nbsp; COMやWMI&lt;BR&gt;3.10. まとめ&lt;BR&gt;&lt;BR&gt;Chapter4. PowerShellを活用するために&lt;BR&gt;4.1.&amp;nbsp; タイプシステム&lt;BR&gt;4.2.&amp;nbsp; コマンドレットを作る&lt;BR&gt;4.3.&amp;nbsp; 他の言語から使用する&lt;BR&gt;4.3.1.&amp;nbsp; PowerShellとC#やVB&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ・PowerShellからC#やVBを使用する&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ・C#やVBからPowerShellを使用する&lt;BR&gt;4.3.2.&amp;nbsp; PowerShellとIronPython&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ・PowerShellからIronPythonを使用する&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ・IronPythonからPowerShellを使用する&lt;BR&gt;4.4.&amp;nbsp; スレッド&lt;BR&gt;4.5.&amp;nbsp; セキュリティ&lt;BR&gt;4.6.&amp;nbsp; まとめ&lt;BR&gt;&lt;BR&gt;Appendix&lt;BR&gt;&lt;BR&gt;執筆時間が長かったため、PowerShell v2.0の最初のCTPも公開されてしまいました。このCTPでは、v1.0を置き換える形でインストールするためにv1.0とv2.0のサイドバイサイドの実行はできませんが、v1.0との互換性を重視しているためv1.0で作成したスクリプトのほとんどが実行できます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6660804" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[PS]WMIの取り扱いについて</title><link>http://blogs.msdn.com/shozoa/archive/2007/10/02/ps-wmi.aspx</link><pubDate>Tue, 02 Oct 2007 11:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5239709</guid><dc:creator>shozoa</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/5239709.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=5239709</wfw:commentRss><description>&lt;p&gt;暫く更新が滞っていました。私事で忙しかったせいですが、今回はPowerShellとWMIで気がついた点を記載します。&lt;/p&gt; &lt;p&gt;Windows Vistaを使ってPowerShellでインストールされたソフトウェアの一覧を表示しようとして、WMIのWin32_Productクラスを使ってみました。&lt;br&gt;&lt;pre&gt;PS (1) &amp;gt;Get-WmiObject Win32_Product

Get-WmiObject : エラーです
発生場所 行:1 文字:14
+ Get-WmiObject  &amp;lt;&amp;lt;&amp;lt;&amp;lt; Win32_Product&lt;/pre&gt;
&lt;p&gt;このようにエラーになってしまいました。一部のソフトウェアが表示される場合もありますが、必ず「Get-WmiObject : エラーです」となってしまいます。色々と調べていくと、Windows Vista のWMIのWin32_Productクラスのバグらしいということが判明しました。この情報は&lt;a href="http://groups.google.com/group/microsoft.public.windows.powershell/browse_thread/thread/a3313bfdeaaca2af/66061dcb9ea6578a" mce_href="http://groups.google.com/group/microsoft.public.windows.powershell/browse_thread/thread/a3313bfdeaaca2af/66061dcb9ea6578a"&gt;ネットニュースのpowershell&lt;/a&gt;の中にありました。この内容を見ると既知のバグでVista SP1で修正される予定だと書かれています。じゃあ、他の方法を使わないとWindows Vistaでインストール済みのソフトウェアの一覧を取得できないことになります。で思いついたのが&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レジストリを列挙する。 
&lt;li&gt;Windows Installer APIを使用する。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;という方法です。今回は、Windows Installer APIを使用してみたいと思います。&lt;br&gt;&lt;pre&gt;PS (2) &amp;gt;$wi = New-Object -ComObject WindowsInstaller.Installer
PS (3) &amp;gt;$wi | Get-Member


   TypeName: System.__ComObject

Name                      MemberType Definition
----                      ---------- ----------
CreateObjRef              Method     System.Runtime.Remoting.ObjRef CreateObjRef(
Type requestedType)
Equals                    Method     System.Boolean Equals(Object obj)
GetHashCode               Method     System.Int32 GetHashCode()
GetLifetimeService        Method     System.Object GetLifetimeService()
GetType                   Method     System.Type GetType()
InitializeLifetimeService Method     System.Object InitializeLifetimeService()
ToString                  Method     System.String ToString()&lt;/pre&gt;このようにWindows Installer のCOMオブジェクトには、何故か実装されているはずのメンバーが見当たりません。何故かなぁと思って調べていくと、タイプライブラリにcoclassが定義されていないようです。このためにNew-Objectコマンドレットでは、プロパティやメソッドをマップできないようです。解決策はないのかなと思って調べていくと、&lt;a href="http://abhishek225.spaces.live.com/blog/cns!13469C7B7CE6E911!165.entry" mce_href="http://abhishek225.spaces.live.com/blog/cns!13469C7B7CE6E911!165.entry"&gt;Abhishek's PowerShell Blog&lt;/a&gt;が見つかりました。この内容を参考に以下のようなスクリプトを作成しました。&lt;br&gt;&lt;pre&gt;# COMオブジェクトを作成する
Function Global:GetComObject($ProgID)
{
  New-Object -ComObject $ProgID
}

# プロパティを呼び出す
Function Global:GetPropFromCom($obj, $PropertyName)
{
  # $obj:COMオブジェクト
  # $PropertyName：プロパティ名
  # $Args：パラメータを必要とするプロパティ
  If ( -Not ($obj -is [System.__ComObject]))
　{ Throw "__ComObjectではありません"; Return }
  # System.Typeを取得して、プロパティを呼び出す
  $type = $obj.GetType()
  $type.InvokeMember( $PropertyName, 
[System.Reflection.BindingFlags]::GetProperty ,
 $null, $obj, $args)
}&lt;/pre&gt;System.Typeのインスタンスを生成してプロパティをInvokeするというのがこのスクリプトです。これを使って以下のように実行すれば、問題なくインストール済みのソフトウェアの一覧を取得することができます。&lt;br&gt;&lt;pre&gt;PS (10) &amp;gt;$wi = GetComObject WindowsInstaller.Installer
PS (11) &amp;gt;$ps = GetPropFromCom $wi Products
PS (12) &amp;gt;ForEach ($i in $ps)
&amp;gt;&amp;gt; {  GetPropFromCom $wi ProductInfo $i ProductName }
&amp;gt;&amp;gt;
Cardmod_x86 and MSITPintool
Microsoft ASP.NET Futures (May 2007)
Microsoft ASP.NET 2.0 AJAX Extensions 1.0
以下続く&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5239709" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[TechEd] PowerShellについて</title><link>http://blogs.msdn.com/shozoa/archive/2007/08/28/teched-powershell.aspx</link><pubDate>Tue, 28 Aug 2007 11:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4606116</guid><dc:creator>shozoa</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/4606116.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=4606116</wfw:commentRss><description>&lt;P&gt;TechEdでリリース済みの動的言語ということでPowerShellを簡単に説明しました。PowerShellで実行できるコマンドには、以下の4種類があります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;コマンドレット：PowerShell独自のコマンドで「動詞-名詞」というネーミング。 
&lt;LI&gt;関数：一連の手続きに名前を付けたもの。 
&lt;LI&gt;スクリプトコマンド：各種のコマンドなどをファイルに保存したもの。 
&lt;LI&gt;ネイティブコマンド：実行可能プログラム(EXEなど)。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;特にネイティブコマンドは重要で、これを使うと「cscript.exe xxxx.vbs」などのWSHのスクリプトをPowerShellの中から実行することができます。つまり、既存のスクリプト資産を移行しなくてもPowerShellで操作できるように配慮されているのです。&lt;/P&gt;
&lt;P&gt;デモでお見せした電卓は、以下のようなものです。&lt;BR&gt;&lt;A href="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/TechEdPowerShell_F04B/wincalc.png" atomicselection="true" mce_href="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/TechEdPowerShell_F04B/wincalc.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=240 alt=wincalc src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/TechEdPowerShell_F04B/wincalc_thumb.png" width=156 border=0 mce_src="http://blogs.msdn.com/blogfiles/shozoa/WindowsLiveWriter/TechEdPowerShell_F04B/wincalc_thumb.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;BR&gt;これはWindows Formsを使って作成しています。このGUIを作成するときに特徴的な書き方をしているのが以下のようなコードです。&lt;BR&gt;&lt;PRE&gt;,"C"+1..3+,"/"+4..6+,"*"+7..9+,"-",0,".","=","+"|ForEach-Object {new-button $_}&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;「new-button」という関数をパイプラインで呼び出しています。パイプラインに渡している配列が、ボタンに表示されている文字列なんです。もちろんFor文やForEach文で作成するという方法もありますが、パイプラインを使ってForループと同じことができるんです。PowerShellって...&lt;/P&gt;
&lt;P&gt;デモでは、このようなGUIのサンプルもお見せしましたが、PowerShellでのGUIプログラミングには、鬼門も潜んでいます。何かと言うとPowerShell.exeは、マルチスレッドで動作している点がGUIと相性が悪いのです。たとえばWindows FormsのWebBrowserコントロールなどは、シングルスレッドでないと利用することができないという制約を持っています。このようなコントロールを普通には扱えないのです。もちろん、独自のコマンドレットを使ったりすれば可能ですし、そういうコマンドレットを公開している方達もいらっしゃいます。&lt;/P&gt;
&lt;P&gt;慣れてくると便利なツールです。PowerShellって。I-Oリダイレクションもサポートしていますし、CSVなどもサポートしていますから。色々な情報を集めてテキストファイルへ出力とかが簡単なんですね。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4606116" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/TechEd/default.aspx">TechEd</category></item><item><title>[TechEd]明日からTechEd横浜が始まります</title><link>http://blogs.msdn.com/shozoa/archive/2007/08/21/teched-teched.aspx</link><pubDate>Mon, 20 Aug 2007 17:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4480273</guid><dc:creator>shozoa</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/4480273.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=4480273</wfw:commentRss><description>&lt;P&gt;明日から今年のTechEd Yokohamaが始まります。その準備に追われているのですが、実はまだデモの内容で悩んでいます。作成済みのデモコードを大幅に手直ししたり、新しいデモ内容を作ってみたりしています。というのも私の担当しているセッションの会場がAルームなもので、会場が広いからどのようなモノをお見せしたものかなという悩みがあるからです。このような状況ですので、さっきもデモの内容を確認したりしています。&lt;/P&gt;
&lt;P&gt;デモのテーマとしては、以下のようなものを考えています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;現状でできること&lt;/LI&gt;
&lt;LI&gt;DLRのオブジェクト共有&lt;/LI&gt;
&lt;LI&gt;Python ASTとDLR ASTを覗く&lt;/LI&gt;
&lt;LI&gt;IronRuby 1.0アルファでできること&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;BR&gt;さてさて、どうしよう。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4480273" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/DLR/default.aspx">DLR</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/Python/default.aspx">Python</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/TechEd/default.aspx">TechEd</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/IronRuby/default.aspx">IronRuby</category></item><item><title>[ps]ByPropertyNameの便利な使い方</title><link>http://blogs.msdn.com/shozoa/archive/2007/07/22/ps-bypropertyname.aspx</link><pubDate>Sun, 22 Jul 2007 03:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3993935</guid><dc:creator>shozoa</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/3993935.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=3993935</wfw:commentRss><description>&lt;P&gt;PowerShellのコマンドレットの引数にByPropertyNameが指定されているものがあります。これを使ったちょっと&lt;A href="http://blogs.wankuma.com/mutaguchi/archive/2007/07/21/86361.aspx" mce_href="http://blogs.wankuma.com/mutaguchi/archive/2007/07/21/86361.aspx"&gt;便利な使い方&lt;/A&gt;を牟田口さんが、まとめてくれました。使い方によっては非常に便利だと思います。&lt;/P&gt;
&lt;P&gt;牟田口さん、丁寧にまとめて下さって有難うございます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3993935" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>[MD3] PowerShellについて</title><link>http://blogs.msdn.com/shozoa/archive/2007/06/22/md3-powershell.aspx</link><pubDate>Fri, 22 Jun 2007 03:53:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3450682</guid><dc:creator>shozoa</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/shozoa/comments/3450682.aspx</comments><wfw:commentRss>http://blogs.msdn.com/shozoa/commentrss.aspx?PostID=3450682</wfw:commentRss><description>&lt;p&gt;MD3の説明でPowerShellの関数って、言語拡張のように見せれるので、中々おもしろいという話をしました。この説明で例題に取り上げたのが、「&lt;a href="http://www.manning.com/payette/"&gt;Windows PowerShell in Action&lt;/a&gt;」という書籍なのですが、この書籍で提供されるているサンプルをご紹介したいと思います。本自体は、500頁ちょっとありますので、読むのも大変なんですけど(私の堅い枕の1つです)。&lt;/p&gt; &lt;p&gt;Capter8のサンプルに「class.ps1」と「demo-class.ps1」というファイルがあります。詳細は「class.ps1」を見ていただく必要がありますが、「demo-class.ps1」で以下のような記述を行っています。&lt;br&gt;&lt;pre&gt;&lt;strong&gt;CustomClass&lt;/strong&gt; point {
    note x 0
    note y 0
    method ToString {
        "($($this.x), $($this.y))"
    }
    method scale {
        $this.x *= $args[0]
        $this.y *= $args[0]
    }
}


$p = &lt;strong&gt;new&lt;/strong&gt; point
&lt;/pre&gt;
&lt;p&gt;このコードの中で「&lt;strong&gt;CustomClass&lt;/strong&gt;」「&lt;strong&gt;note&lt;/strong&gt;」「&lt;strong&gt;method&lt;/strong&gt;」「&lt;strong&gt;new&lt;/strong&gt;」というキーワードが、実は関数として「class.ps1」で定義されています。クラスという定義方法をPowerShellは提供していませんが、上記のように関数を使用することで、あたかもオペレータを拡張したように見えます。個人的には、これって「&lt;font color="#ff0000"&gt;おもしろいよなー&lt;/font&gt;」と思っています。&lt;/p&gt;
&lt;p&gt;この面白ろさというかを皆さんにお伝えしたくて、MD3でPowerShellを取り上げました。それから、DownLoadセンターを見ていてPowerShellを利用する方にお勧めのドキュメントをみつけました。それは、&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3b3f7ce4-43ea-4a21-90cc-966a7fc6c6e8&amp;amp;DisplayLang=en"&gt;PowerShell Graphical Help File&lt;/a&gt;です。PowerShellのヘルプのchm形式です。英語で記述されていますが、構文などの全体像を見るのに役立ちます。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3450682" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/shozoa/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/shozoa/archive/tags/PowerShell/default.aspx">PowerShell</category></item></channel></rss>