問題の声明
ロシアの地域設定と英語のMS Office 2010を備えたWindows 7オペレーティングシステムがあります。現在実行中のシステムプロセスに関する情報を収集し、それに基づいてExcelスプレッドシートを作成する必要があります。 さらに明確にするために、円グラフも作成します。 MS PowerShellを使用して問題を解決します。解決策
それでは、最初に始めましょう-OSプロセスに関する情報を収集し、Excel.Applicationオブジェクトを作成します。$ processes = Get - WmiObject - Class Win32_Process #実行中のプロセスのリスト
$ excel = New - Object - ComObject Excel 。 申込み
$エクセル 。 SheetsInNewWorkbook = 1 #新しく作成されたExcelブックのシート数(デフォルト3)
これらの3行に従うと、OSとMS Officeの地域設定が一致しないため、画面に「例外設定」「SheetsInNewWorkbook」:「古い形式または無効なタイプライブラリ」という「神秘的な」メッセージが表示されます。 (HRESULTからの例外:0x80028018(TYPE_E_INVDATAREAD)) "。" これは簡単に解決されます-現在の地域設定を値「en-US」に設定する必要があります。
#地域設定の以前の値を保持
$ OldCulture = [ システム 。 スレッド化。 スレッド] :: CurrentThread 。 現在の文化
$ culture = [ システム 。 グローバリゼーション CultureInfo ] "en-US" # en-US の地域設定を設定する
#このスクリプトのどこかでエラーが発生した場合に実行されるブロック
trap
{
#*************************************************** ********************************
#****ここに、スクリプトを正しく完了するために必要なコードを示します***
#*************************************************** ********************************
#以前の地域設定を復元し、スクリプトを終了する
[ システム 。 スレッド化。 スレッド] :: CurrentThread 。 CurrentCulture = $ OldCulture ; 休憩 ;
}
[ システム 。 スレッド化。 スレッド] :: CurrentThread 。 CurrentCulture = $ culture #新しい地域設定を適用
その後、前の3つのコマンドを記述し、作成したExcelインスタンスを表示して、新しいブックを作成します。
$エクセル 。 可視= $ true
$ワークブック = $エクセル 。 ワークブック。 追加( )
$ブック 。 ワークシート。 アイテム( 1 ) 。 Name = "Processes" #便宜上、単一のテーブルの名前を変更
$シート = $ワークブック 。 ワークシート。 item ( "Processes" ) # "Processes"テーブルを選択(リンクを取得)
必要なテーブルが作成されたので、今度はその設計を取り上げます。 表の最初の行にはタイトルが含まれます。 テーブルの残りの部分から視覚的に分離するには、プロパティ名を太字で強調表示し、タイトルフレームを描画します。 この目的のために、xLineStyle、xlColorIndex、およびxlBorderWeight列挙を使用します。 円グラフを設計するには、xlChartType列挙が必要です。 生活をさらに簡素化するために、使用する4種類の列挙のそれぞれにエイリアスを作成します。 これを行うには、列挙型の名前である文字列を型([type])に変換する必要があります。
$ row = 2 #テーブルの最初の行はビジーなので、データは2番目の行から書き込まれます
$ lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [タイプ]
$ colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [タイプ]
$ borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [タイプ]
$ chartType = "microsoft.office.interop.excel.xlChartType" -as [タイプ]
テーブルの最初の行をフォーマットします。
for ( $ b = 1 ; $ b - le 2 ; $ b ++ )
{
$シート 。 セル。 アイテム( 1 、 $ b ) 。 フォント 太字= $ true
$シート 。 セル。 アイテム( 1 、 $ b ) 。 ボーダーズ。 LineStyle = $ lineStyle :: xlDashDot
$シート 。 セル。 アイテム( 1 、 $ b ) 。 ボーダーズ。 ColorIndex = $ colorIndex :: xlColorIndexAutomatic
$シート 。 セル。 アイテム( 1 、 $ b ) 。 ボーダーズ。 重量= $ borderWeight :: xlMedium
}
#テーブル列に意味のある名前を付ける
$シート 。 セル。 item ( 1、1 ) = "プロセス名"
$シート 。 セル。 item ( 1、2 ) = "ワーキングセットサイズ"
次に、対応するテーブルセルの$ processes変数に格納されているプロセス情報を配置します。 プロセス情報の収集をバイパスするループを編成します。 ループ変数$ processは、現在のアイテムをコレクションに保存します。 それから、最初の列にプロセスの名前を入れ、2番目の列にworkingSetSizeプロパティの値を入れます。
foreach ( $プロセスの $プロセス )
{
$シート 。 セル。 item ( $行 、 1 ) = $ process 。 お名前
$シート 。 セル。 item ( $行 、 2 ) = $ process 。 workingSetSize
$ x ++
}
#コンテンツに応じて列幅を調整します
$範囲 = $シート 。 usedRange
$範囲 。 EntireColumn 。 自動調整( ) | アウト- ヌル
ブックにチャートを追加するときです。 ワークブックのcharts.add()関数は、デフォルトで棒グラフを追加します。 また、目的のフォームのダイアグラムを取得するには、ダイアグラムのタイプを決定する列挙の値を設定する必要があります。 タイプ$ chartType-xl3DPieExploded(三次元カット円グラフ)の可能な値の1つを選択します。 $ range変数で定義された範囲をチャートのデータソースとして設定します。
$ブック 。 チャート。 追加( ) | アウト- ヌル
$ブック 。 チャート。 アイテム( 1 ) 。 名前= 「ワーキングセットサイズ」
$ブック 。 ActiveChart chartType = $ chartType :: xl3DPieExploded
$ブック 。 ActiveChart SetSourceData ( $範囲 )
次に、より大きな効果を得るために、作成した図を15度ずつ360度回転させます。
for ( $ i = 1 ; $ i - le 360 ; $ i + = 15 )
{
$ブック 。 ActiveChart 回転= $ i
}
この美しさがすべて消えないようにするには、作成した本を保存する必要があります。 最初に、Test-Pathコマンドレットを使用して、同じ名前のテーブルを確認します。 このようなテーブルが見つかった場合は、Remove-Itemを使用して古いファイルを削除し、$ strPath変数が指す場所に現在のブックを保存します。
$ strPath = "path \ t o \ f ile \ f ile_name.xlsx"
if (テスト-パス$ strPath )
{
削除-アイテム$ strPath
}
$エクセル 。 Activeworkbook SaveAs ( $ strPath )
次に、Excelを閉じる必要があります。 これを行うには、まず占有されているリソース($シート、$範囲)を解放し、ブックを閉じてから、Excel自体を閉じます。
$シート = $ null
$範囲 = $ null
$ブック 。 閉じる( $ false )
$エクセル 。 終了( )
そして、すべてがうまくいきますが、タスクマネージャーを見ると、Excelプロセスがまだ「ハングアウト」していることがわかります。 少なくとも美しくはありません。 これを防ぐには、事前に$ excel変数をリセットして、強制的にガベージコレクターを呼び出します。 そして、もちろん、以前の地域設定を復元します。
$ excel = $ null
[ GC ] :: 収集 ( )
[ GC ] :: WaitForPendingFinalizers ( )
#以前の地域設定を復元する
[ システム 。 スレッド化。 スレッド] :: CurrentThread 。 CurrentCulture = $ OldCulture
利便性を高めるために、$ strPathをパラメーターにし、上記のすべて(叙情的な余談を除く)を1つのps1ファイルにコピーできます。 だから、コピーして...実行します! そしてそれは動作します! はい、そして予想通り! しかし、エラーがこのファイル内のどこかにポップアップする瞬間まで...
管理は「トラップ」ブロックに進みますが、これまでは以前の地域設定を返す以外に何もありません。 そのため、クラッシュ後、未完成のExcelブックは画面に残り、閉じたときに実行中のプロセスのリストでExcelが「ハング」したままになります。 非常に明るい見通しではありませんか?
したがって、これを避けるには、「Here will be ...」行のコメントの代わりに、「trap」ブロックに次のコードを追加します。
if ( $ワークブック -ne $ null )
{
$シート = $ null
$範囲 = $ null
$ブック 。 閉じる( $ false )
}
if ( $ excel - ne $ null )
{
$エクセル 。 終了( )
$ excel = $ null
[ GC ] :: 収集 ( )
[ GC ] :: WaitForPendingFinalizers ( )
}