by manamana
27. 6月 2013 12:30
VBAでは構築が困難な例として、Webとの連携が挙げられます。
その点、PowerShell は .Net の資産を有効に使えるので Web から簡単に情報を取得出来ます。
New-WebServiceProxy
このコマンドレットは、 任意のWebサービスに接続して情報をXML形式で受け取ります。
後はそれを好きに加工して表示してやればいろいろ面白いことが出来るわけです。
気象情報でも取得しよう! と思った所、先人が居られました。とても参考になります。
PowerShellでGlobalWeatherから天気情報取得してみる
ここでは、例によって Excel PowerShell Tool で動かすようにします。
予め、観測地点の一覧をテーブル化し、リストから選択するという Excel っぽい感じです。
ソースです。Cellに直接データを入れています。もう力技ですねww
#@PSTOOL
$ws = $_Excel.Activesheet
$addin = $_Excel.ComAddins.Item("ExPSTool").Object
$city = $ws.Range("WeatherInfoCity").Value2
$web = New-WebServiceProxy -uri http://www.webservicex.net/globalweather.asmx
[xml]$xml = $web.GetWeather($city, "Japan")
$CurrentWeather = $xml.CurrentWeather
$rg = $ws.Range("WeatherInfo")
$rg.Cells.Item(1, 1).Value2 = $CurrentWeather.Time
$rg.Cells.Item(2, 1).Value2 = $CurrentWeather.Wind
$rg.Cells.Item(3, 1).Value2 = $CurrentWeather.SkyConditions
$rg.Cells.Item(4, 1).Value2 = $CurrentWeather.Temperature
$rg.Cells.Item(5, 1).Value2 = $CurrentWeather.RelativeHumidity
$rg.Cells.Item(6, 1).Value2 = $CurrentWeather.Pressure
東京を選んでみました。
次は普天間基地です。30℃超えてますね…
PowerShellで Excel を操作すると、反応が異様に遅いです。表示が目で追えるレベルです。
今回のようにデータ数が少なければ良いのですが、大量のデータを PowerShell 経由で Excel に出力するには
それなりの工夫が必要になります。この辺はまたの機会に…
ダウンロード↓↓↓
お天気.xlsx (17.19 kb)
755092ae-cd17-41b4-b6d1-3349b70af9a7|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
25. 6月 2013 10:30
Hyper-Vのホスト端末でタスクマネージャを監視していても、サーバー全体のCPU使用率は表示されません。
これは、ホスト自体も仮想化されているため、タスクマネージャはホスト端末だけのCPU使用率を示すからです。
サーバー全体のCPU使用率を知りたい場合には、パフォーマンスモニターを利用するのが一般的でしょう。
パフォーマンス・モニタでHyper-Vサーバの実際のCPU使用率を調査する (@IT)
このパフォーマンスモニターですが、PowerShellからは Get-Counter コマンドレットで同様の情報を取得可能です。
そこで、Excel PowerShell Tool 上で CPU使用率を表示するシートを作ってみました。
#@PSTOOL
$ws = $_Excel.Activesheet
$addin = $_Excel.ComAddins.Item("ExPSTool").Object
#==== パフォーマンスモニター用の型定義(C#を利用)
$MyType = @"
public class PerMonitorType {
public string Timestamp;
public double ProcessorTime;
public double TotalRunTime;
}
"@
#--- 型の追加(※既存の場合はエラーになるので SilentlyContinue)
Add-Type -TypeDefinition $MyType -ErrorAction:SilentlyContinue
$PerMonitor = New-Object -TypeName PerMonitorType
#=== 使用するカウンター
$counters = @(
"\Processor(_total)\% Processor Time",
"\Hyper-V Hypervisor Logical Processor(_total)\% Total Run Time"
)
#=== 変数の初期化
$List = $ws.ListObjects.Item("PerMonitorTable")
$top = $List.HeaderRowRange
$addin.SetStartRange($top)
$i = 0
#=== Get-Count のログを加工しながら出力(60回で先頭に戻る)
Get-Counter -Counter $counters -SampleInterval 1 -Continuous | foreach {
$PerMonitor.Timestamp = $_.Timestamp.ToString("hh:mm:ss")
$PerMonitor.ProcessorTime = $_.CounterSamples[0].CookedValue
$PerMonitor.TotalRunTime = $_.CounterSamples[1].CookedValue
$PerMonitor #←これで出力
$i += 1
if ($i -gt 60) {
$addin.SetStartRange($top)
$i = 0
}
}
このスクリプトは Get-Counter の -Continuous オプションを利用して、CPU利用率を取得し続けます。
ここでは、ホスト端末のCPU使用率である "\Processor(_total)\% Processor Time" と、
Hyper-Vを含めたサーバー全体のCPU使用率である "\Hyper-V Hypervisor Logical Processor(_total)\% Total Run Time" を
指定してやり、 それを専用の PerMonitorType型変数 $PerMonitor に代入後に出力しています。
Add-Type による独自の型定義はとても便利なので参考にしてください。
殆どの場合、TotalRunTime > ProcessorTime になりますが、たまに逆転します。たぶん誤差です。
ホスト端末でHD動画を再生してやると ProcessorTime が跳ね上がります。
仮想端末でHD動画を再生すると、TotalRunTime部分だけが跳ね上がります。
PS Tool は、PowerShell から得られた情報をそのまま Excel 上に展開します。
それをグラフ等に連動させることにより簡単にくモニターシステムが構築できるわけです。
ただし、Excelの制限もありリアルタイム性には欠けます。
このスクリプトでは、1秒毎に情報を更新したかったのですが、私の環境では約2秒毎になってしまいました。
知人の新モデルでは普通に更新できるのですが…orz
9de1ed44-6548-4fa5-bc6c-66a6b4e389fb|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V | PowerShell
by manamana
25. 6月 2013 04:00
PowerShellの開発に欠かせない PowerGUI ですが、なぜかメニューが消えてしまいました。
先日の電源トラブルが原因なのか、バージョンアップが原因なのかよくわかりません。
再インストールもやってみましたがメニューは復活しなかったのでちょっと調べてみました。
PowerGUI のメニューを制御しているのは以下のファイルです。
C:\Users\ユーザー名\AppData\Roaming\Quest Software\PowerGUI\BarManagerLayoutFile.xml
何かの理由でこの BarManagerLayoutFile.xml が壊れてしまい、結果としてメニューが消えてしまったようです。
この場合、 BarManagerLayoutFile.xml を削除してから PowerGUI を起動すればメニューが初期化されます。
このような状態になるのは稀でしょうが、とりあえずメモメモ。
d9a10b45-84a1-435e-b37a-50f65af20d2d|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
18. 6月 2013 01:00
長らく MDI(=Multi Document Interface)を採用していた Excel ですが、2013から SDI になりました。
直接の原因はマルチモニター環境が普及してきたからだと思っていますが、よく知りません。
Excel 2013 で Excel PowerShell Tool を使っていると、PowerShell スクリプトを実行中は
他の Excel ウィンドウの PS Tool も実行中になってしまい、何か不自然です。
MDIスタイルの Excel 2010 なら、納得できる動きなのですが…
これは、 PS Tool のリボンが、一つの Excel インスタンスに紐付いていることから、当然の動きです。
もしウィンドウ毎に別の PowerShell スクリプトを実行したいなら、Excel を複数起動しなければなりません。
Excel 2010までは、単純にスタートメニューから起動すれば複数起動が可能でしたが、
Excel 2013ではちょっとした操作が必要になります。
タスクバー上のExdelアイコンを右クリックしてメニューを出し、Altキーを押しながら左クリックをします。
すると次のメッセージが出てくるので、これに「はい」を選択すれば、新しい Excel.exe が起動します。
タスクマネージャーから、Excel.exeが複数起動している事が確認できます。
余談ですが、Win8のタスクマネージャーはアプリ内のウィンドウ一覧を表示してくれるので便利ですね。
Excelのメニューは MDI上の Workbook を対象にしている物があり、MDI の方が使いやすいと思っていますが、これも時代の流れ…
マルチモニター環境が欲しいけど場所がないのだったwww
164e1157-cc03-47b6-9574-08d7c45acb7c|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell
by manamana
29. 5月 2013 18:00
忙しくてブログの更新をサボっていたら5月も終盤、関東も梅雨入りですか…
その忙しい中、時間を作ってはコソコソやっていた Excel PowerShell Tool(=PS Tool)の新版をUpしました。
Excel PowerShell Version 1.0
今度の PS Tool は、現場のツールというより、Excel を PowerShell のフロントエンド化を目指しています。
スクリプトを内包可能として外部スクリプトファイルを不要にしてみたり、
スクリプトの実行中でもExcelの操作が可能になるように PowerShell を非同期実行にしています。
動作は多少重くなりましたが、応用範囲が大きく広がりました。
VBAとの連動も考慮していて、VBAとPowerShellの相互運用が可能です。
PowerShell で GUI を構築することは面倒ですが、VBA なら簡単です。
VBA と PowerShell を組み合わせると効率的な開発が出来ると思います。
旧バージョンは、手動操作が必須で、使いにくい部分も多かったのですが、
新バージョンは、Runボタンを押すだけで動作可能になっています。
あ、もちろんちゃんと準備しないと動きませんけどww
まだ問題点もあると思いますが、皆さん是非使ってみてください。
ご意見、ご感想をお待ちしています。
b107fdbb-4e1a-4601-b534-a30218a28636|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
PowerShell