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なんだから、アリなんじゃないかな…。
[ ツッコむ ]
以上です。