2013/08/02(金) [n年前の日記]
#2 [ruby] Rubyでフォルダ選択ダイアログを開く方法について
win32oleが封じられた状態で、どうやってフォルダ選択ダイアログを開こうかと悩んでたけど。フォルダ選択ダイアログを開いて結果を返すだけのWSHを書いて、それを Ruby から呼び出したらどうかと思いついた。
こんな感じでどうだろう…?
select_open_folder.vbs
select_open_folder.rb
なんだか上手く行っているような気もする。本番スクリプトに組み込んでみるかな…。
考えてみれば、*NIX文化圏の流儀 ―― 単機能のプログラムを組み合わせて目的を果たす、という考え方を Windows上で利用するのもアリだよな、という気もしてきたり。*NIXを軽くお手本にした、MS-DOSの延長線上にあるOSなんだから、アリなんじゃないかな…。
こんな感じでどうだろう…?
select_open_folder.vbs
' フォルダ選択ダイアログを開いて、選択されたフォルダパスを返す VBScript Option Explicit On Error Resume Next Dim oParam, oShell, oFolder, s, dirname Set oParam = WScript.Arguments If oParam.Length > 0 Then s = oParam(0) Else s = "フォルダを選択してください" End If dirname = "::" Set oShell = WScript.CreateObject("Shell.Application") If Err.Number = 0 Then Set oFolder = oShell.BrowseForFolder(0, s, 0) If Not oFolder Is Nothing Then ' フォルダ選択がされた場合 dirname = oFolder.Items.Item.Path Else ' キャンセルされた場合 dirname = "" End If Else ' エラーが発生した場合 ' WScript.Echo "エラー:" & Err.Description dirname = "" End If ' 結果を出力 WScript.Echo dirname Set dirname = Nothing Set s = Nothing Set oFolder = Nothing Set oShell = Nothing Set oParam = Nothing
select_open_folder.rb
#!ruby -Ks # # DXRubyを使ったスクリプト中から、 # vbsを呼ぶことでフォルダ選択ダイアログを開いて、 # 結果を受け取ってみる require 'dxruby' fnt = Font.new(12) folder = "" Window.loop do break if Input.keyPush?(K_ESCAPE) if Input.keyPush?(K_Z) title = "画像フォルダを選択してください" wsh_fname = "select_open_folder.vbs" folder = %x[ cscript //nologo #{wsh_fname} #{title} ] folder.chomp! # 返ってきた文字列には改行も含まれているので除去 folder = "" if folder =~ /^::/ # 特殊フォルダを選択された際の対策 end Window.drawFont(16, 16, "Z : フォルダ選択ダイアログを開く", fnt) Window.drawFont(16, 32, "ESC : 終了", fnt) Window.drawFont(16, 64, "Folder : [#{folder}]", fnt) end
なんだか上手く行っているような気もする。本番スクリプトに組み込んでみるかな…。
考えてみれば、*NIX文化圏の流儀 ―― 単機能のプログラムを組み合わせて目的を果たす、という考え方を Windows上で利用するのもアリだよな、という気もしてきたり。*NIXを軽くお手本にした、MS-DOSの延長線上にあるOSなんだから、アリなんじゃないかな…。
[ ツッコむ ]
以上です。