はじめに
このツールは以下のフォルダパス取得関数のファイル版のような存在である。
そのため、基本的な仕組みは共通である。
概要
Powershell上で指定したファイルのパスを返す自作関数の紹介。
単体での利用ではなく、他のスクリプトなどの処理から呼び出すことを前提としている。
ファイル選択ダイアログを使ったファイルパス取得にも対応。
ユースケース
ツールなどで特定のファイルを指定する必要が有る際に呼び出す。
主にインタラクティブなCLIツールとして使用可能。
関数紹介
関数名:Select-File
機能要件
- 任意のファイルのフルパスを返す
- インタラクティブな処理を可能にする
- ダイアログボックスを使用したGUIでのインタラクティブな処理を盛り込む。
- 指定パスが存在するか判定処理をいれる
- 指定パスがファイルであるか判定処理をいれる
ソースコード
Select-File
###################
#ファイルパス取得関数
###################
function Select-File(){
###################
#<概要>
#指定したファイルパスを呼び出し元に返します。
#<書式>
#Select-Dir [-cliDialog | -guiDialog] [-Path <ファイル名>]
###################
Param(
#オプションの規定値はCLIでのダイアログ表示
[switch]$cliDialog = $true, #cliDialogのブール値は処理には使わない。デフォルトの動作をわかりやすくするためにあえて記述している。
[switch]$guiDialog,
[string]$Path =""
)
###############
#guiDialogの処理
###############
if($guiDialog){
Add-Type -AssemblyName System.Windows.Forms
$dialog = New-Object System.Windows.Forms.OpenFileDialog -Property @{
Title = "ファイルを選択してください"
}
if($dialog.ShowDialog() -eq "OK") {
$File_name = $dialog.FileName
Write-Host "'${File_name}'が選択されました。"
return $File_name
}else{
Write-Host "ファイルは選択されませんでした。"
return
}
}
###############
#cliDialogの処理
###############
#引数にパスが指定されているか判定
if($Path -eq ""){
$File_name = Read-Host "対象ファイルのパスを入力してください。"
$File_name = $File_name -replace '^"|"$' -replace "^'|'$"
if($File_name -eq ""){#Read-Hostは何も入力しなかった場合に空文字列が返される(nullじゃない点に注意)
Write-Host "パスが未指定のため処理を終了します。"
return
}
}else{
$File_name = $Path
}
#対象ファイルの存在確認
$bool = Test-Path -Path $File_name -PathType Leaf
if(! $bool){
Write-Host "対象パスのオブジェクトはファイルではありません。"
throw "'${File_name}' is not File"
}
return $File_name
}
書式
書式
Select-Dir [-cliDialog | -guiDialog] [-Path <string>]
Select-Dirとの差異
私が自作したフォルダパス取得用の関数(Select-Dir)とコード上以下の点が異なる。
- Open.File.Dialogクラスを使用
- ダイアログで選択された値を参照するためのプロパティ※が異なる。
- Test-Pathコマンドレットの-Pathtypeが"Leaf"(ファイル判定)
※"FileDialog.FileName"
今後
相対パスから絶対パスへ変換する仕組みを入れる予定。
ファイルの複数選択を可能とする仕様にするか否か考え中...
修正履歴
更新日:2023/11/9
Read-Hostコマンドに入力するパスにクォーテーションが含まれている場合に、
ファイル判定処理でfalseとなりthrowされる問題を修正しました。
参考