PowerShellでフォルダーの参照ダイアログを表示するには

Windows を使用していて。

ファイルの整理など、なにか細々とした作業をするとき、今までコマンドプロンプトを使用していましたが、やはりCUI(コマンド操作)は辛いものがあります。

GUI(グラフィカル操作)を使用するため、PowerShellに切り替えたいと思いまして。

手始めに、フォルダーの参照画面を表示して、選ばれたフォルダーを変数に格納する機能を記録しておこうと思います。


PowerShellでフォルダーの参照ダイアログボックスを表示するには

PowerShellのバージョンは5.1

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

実行は、緑色の▶ボタンにて。

実行結果が、ISEの左下に表示されました。

フォルダを選択せず、キャンセルした場合はNULL文字、空文字となります。

フォルダ選択後、$folder変数に、選択したフォルダのパスが入りますので、そちらを次に使用するかたちになります。


コマンドプロンプトは、基本的に「手続き型」言語でした。if文やfor文は使用可能ですが、関数やクラスは使用できませんでした。:ラベルやGOTO文、CALL文が「手続き型」の部分で、共通部品のようなものは作れませんでした。

PowerShellの場合、FunctionやClass文が使用可能のため、共通で使用する部品を作り、あとで使い回すことが可能です。モジュールと呼ばれるファイルになりますが。

まあこのあたりは追々。

それではまたお会いしましょう。

スポンサーリンク

フォローする

スポンサーリンク