業務改善!Windows PowerShell入門

Windows PowerShellで、とにかく楽をしたい!実際に仕事で楽になった事、便利になった事を紹介しつつ進めていきます。

PowerShell ファイルを開くダイアログを召喚しろ!


 

 

スクリプトを作成していると、往々にして処理対象の入力ファイルを必要とする場合がある。こんな場合、どうするか?

 

1.スクリプトにファイルパスを直接埋め込む。
2.Read-Hostコマンドレットを利用し、コンソールにファイルをドラッグ&ドロップ

 

上記が一番手っ取り早い方法であろう。

しかし、「スクリプト配布」を考えたとき、これらはどうか?

 

  • 1番はファイルパスが常に固定なとき以外は論外である。
  • 2番はまぁ、1番より進化したやり方ではあるが、慎重を期するシーンではマウス誤操作の懸念がある。

 

さらっと、考察するだけでこんな問題がある。
よって、これらを解決するための手法を考えねばならない。

 


.NET Frameworkの御力にあっさりすがれ!

.NET FrameworkWindows.Forms名前空間にあるOpenFileDialogクラスに頼れば、問題解決ができる。 こいつを使えば、「ファイルを開く」ダイアログを表示することができる。

 

では、実践的なサンプルと実行結果といこうゼ!

内容は、以下のようなCSVファイルを「ファイルを開く」ダイアログを使って、ユーザに選んでもらい、簡易GUIに出力して確認してもらうという想定だ。

 

 f:id:acoustic_groove:20171230003251p:plain

第9回男性が選ぶなりたい顔ランキング.csv

 

 

#------------------------------------------------
# 処理名:Fn_OpenFile()
# 概 要:ファイルを開くダイアログを表示する 
# 引 数:なし
# 戻り値:ファイル名フルパス
#------------------------------------------------
Function Fn_OpenFile(){
    
    #アセンブリのロード
    Add-Type -AssemblyName System.Windows.Forms

    #ダイアログインスタンス生成
    $dialog = New-Object Windows.Forms.OpenFileDialog
    
    #タイトル、選択可能ファイル拡張子、初期ディレクトリ
    $dialog.Title = "ファイルを選んでくれ!"
    $dialog.Filter = "CSVファイル(*.csv) | *.csv"
    $dialog.InitialDirectory = "C:\hoge\CSV"
  
    #ダイアログ表示
    $result = $dialog.ShowDialog()

    #「開くボタン」押下ならファイル名フルパスをリターン
    If($result -eq "OK"){
        Return $dialog.FileName 
    }Else{
        Break
    }

}

#ファイル取得
$file = Fn_OpenFile

#CSVファイルを読み込んでグリッド出力する
Import-CSV $file | Out-GridView -Title "第9回男性が選ぶなりたい顔ランキング"

Read-Host "×ボタンで終了"

 

 

f:id:acoustic_groove:20171230004229p:plain

ファイルを開くダイアログ

 

f:id:acoustic_groove:20171230004239p:plain

Out-GridView


「ファイルを開くダイアログ」はとても汎用性が高い!
よって、関数化している。俺は普段、仕事で使う自分の端末ではプロファイルに登録している。
プロファイルに登録しておけば、いつでも呼び出せるからな。

 

▼プロファイルについての記事はこちら

PowerShell プロファイルを利用しろ!#1 - 業務改善!Windows PowerShell入門

PowerShell プロファイルを利用しろ!#2 - 業務改善!Windows PowerShell入門

  

 

OpenFileDialogクラスの主要メンバ

 

<プロパティ>
Title
ダイアログのタイトル。

 

Filter
ダイアログで選択可能な拡張子。
"hogeファイル(*.hoge) | *.hoge" 形式で設定する。
パイプの左側:ファイルの種類に表示する文字列
パイプの右側:拡張子

 

InitialDirectory
初期表示ディレクトリ。
自分の端末で作業する場合は、$home + "\Desktop" で、デスクトップを初期表示ディレクトリにしておくと何かと便利だゼ!
デスクトップには色んなショートカットが置いてあるはずだからな。
($homeは環境変数であり、ホームパスを取得できる。)

 

FileName
ファイル名フルパス。

 

<メソッド>
ShowDialog()
ダイアログ表示をする。戻り値あり。
開く:OK
キャンセル:Cancel

 

 

ついでに、今回登場したコマンドレットを紹介したい。

  • Import-CSVエイリアス:ipcsv)
    CSVファイルを読み込んで、PSCustomObjectに変換する。
    メチャクチャよく利用するので、今後これについての記事を書きたいと思う。
  • Out-GridView(エイリアス:ogv)
    オブジェクトをグリッドビュー出力する。
    メチャクチャよく利用する。GUIで色々見れるのは便利だ。
    Titleパラメータでタイトル文字を設定することができる。
 

 

気をつけやがれ!

「ファイルを開く」ダイアログを実装して、PowerShell 2.0でやるとうまくいかない場合がある。 ダイアログがいつまでたっても表示されない。 スクリプトをISEから実行する場合は問題ない。 問題があるのは以下のケースだ。

 

・コンソールから実行する場合
スクリプトファイルを「右クリック→PowerShellで実行」の場合

 

なぜ、動かないのかは、STA(シングルスレッドアパートメント)、MTA(マルチスレッドアパートメント)の違いから発生する。

 

 

PowerShellがMTAなのに対しWindows.Forms名前空間に属しているOpenFileDialogクラスは、STAを使用するためである。

 

さて、STAとMTAが何たるかであるが、どえらい簡単に説明する。

 

そもそも、スレッドとはプログラムの処理の実行単位である。 それが、シングル(1本線)、マルチ(枝分かれした線)かということである。

フローチャートでいうところの開始から終了まで、1本線でいくのか、枝分かれした線でいくのかという話だゼ!

 

仕事で使っている端末はWindows7 SP1で、MTAモードのため、普通ならISEからしか使えない。 しかし、PowerShell.exeの起動オプションには、STAというオプションがある。

 

よって、コンソールで以下のように実行すれば、解決することができる。

 

PowerShell -STA ./hoge.ps1 

 

 

また、スクリプト配布を視野に入れる場合は、以下のような解決方法もある。

 

PowerShellスクリプトを起動するための、起動用スクリプトをVBSやバッチファイルから作る。
・この起動用スクリプトの中にSTAオプションを仕込んでおく。

 

これについては、以下の記事にて詳しく書いてある。 

PowerShell スクリプトファイルを配布しろ!#3 - 業務改善!Windows PowerShell入門

 

 

さて、2017年ももうすぐ終わりだな......。

PowerShell、イエーイ!

 

ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)~ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。

▼ロリポップ!レンタルサーバーはこちら