ファイルの整理など、なにか細々とした作業をするとき、今までコマンドプロンプトを使用していましたが、やはりCUI(コマンド操作)は辛いものがあります。
GUI(グラフィカル操作)を使用するため、PowerShellに切り替えたいと思いまして。
手始めに、フォルダーの参照画面を表示して、選ばれたフォルダーを変数に格納する機能を記録しておこうと思います。
目次
PowerShellでフォルダーの参照ダイアログボックスを表示するには
PowerShellのバージョンは5.1
Windows 10バージョン22H2を使用しました。
Windows 11を考慮して、PowerShellのバージョン5系列と、7系列のどちらでも動作するように作成しようと思います。
.NetのアセンブリをAdd-Typeで登録
コマンドプロンプトではNGで、PowerShellでできることとしまして、.NETのアセンブリや、COMオブジェクトを使用できる点が挙げられます。
フォルダー選択ダイアログは、.NETのSystem.windows.Formsを使用します。
アセンブリをPowerShellのセッションに登録する方法は、Add-Typeコマンドレットを使用します。(現役の方法
Load~をつかうやり方は古いやり方のため、Add-Typeに移行しておいたほうが良さそうです。
またアセンブリの場合、使い終わったあとのオブジェクトの解放は、PowerShellが自動でやってくれるようです。
余談ですがCOMの場合は明示的に解放しないと残りますので注意が必要です。このあたりは追々。
PowerShellでフォルダー参照ダイアログボックスを表示
こののような内容を、「Windows Power Shell ISE」に入力します。
class DenorFileUtility {
static [string] SelectFolder() {
return [DenorFileUtility]::SelectFolder("")
}
static [string] SelectFolder([string]$InitialFolder) {
# LoadWithPartialNameは後方互換の古い方法 Add-Typeを使いましょう
# [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
Add-Type -AssemblyName System.windows.forms
$dialog = New-Object -TypeName System.Windows.Forms.FolderBrowserDialog
$dialog.rootfolder = "MyComputer"
$dialog.SelectedPath = $InitialFolder
if($dialog.ShowDialog() -ne "OK") {
$selected = $null
} else {
$selected = $dialog.SelectedPath
}
Remove-Variable -Name dialog
Clear-Variable -Name dialog
return $selected
}
}
# 既定選択なし
$folder = [DenorFileUtility]::SelectFolder()
# 初期値デスクトップの場合
# $folder = [DenorFileUtility]::SelectFolder($env:USERPROFILE+"\Desktop")
# 変数表示
$folder
# 変数クリア
Clear-Variable -Name folder
Remove-Variable -Name folder
# 使い終わった変数が残っていないか確認
# Get-Variable
フォルダを選択せず、キャンセルした場合はNULL文字、空文字となります。
フォルダ選択後、$folder変数に、選択したフォルダのパスが入りますので、そちらを次に使用するかたちになります。
コマンドプロンプトは、基本的に「手続き型」言語でした。if文やfor文は使用可能ですが、関数やクラスは使用できませんでした。:ラベルやGOTO文、CALL文が「手続き型」の部分で、共通部品のようなものは作れませんでした。
PowerShellの場合、FunctionやClass文が使用可能のため、共通で使用する部品を作り、あとで使い回すことが可能です。モジュールと呼ばれるファイルになりますが。
まあこのあたりは追々。
それではまたお会いしましょう。