mieki256's diary



2013/08/02(金) [n年前の日記]

#2 [ruby] Rubyでフォルダ選択ダイアログを開く方法について

win32oleが封じられた状態で、どうやってフォルダ選択ダイアログを開こうかと悩んでたけど。フォルダ選択ダイアログを開いて結果を返すだけのWSHを書いて、それを Ruby から呼び出したらどうかと思いついた。

こんな感じでどうだろう…?

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なんだから、アリなんじゃないかな…。

以上です。

過去ログ表示

Prev - 2013/08 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project