松崎といいます。

数年来、不思議に思っていることがありまして、
rubyそのものの問題ではないと思いますが、
ほかに再現する環境を知らないためこちらでお尋ねします。

やろうとしていることは、win32oleを使ったExcelファイルの加工なのですが、
コマンドプロンプト(cmd.exe)から実行した場合はうまくいくのに、
cygwinのシェル(zsh.exe)から実行した場合はうまくいきません。
# したがって、対症療法は確立しております


モデルとしてごくシンプルなスクリプト(メール末尾の excel_open.rb)で
空っぽの Book1.xlsx と旧形式である Book1.xls を開くことを例にします。

Windows 7でcygwinのターミナルとしてminttyをつかっており、
そこから旧形式を開こうとするとエラーで止まります。
しかしコマンドプロンプト(cmd.exe)からならば問題ないという差が出ます。

% uname -a
CYGWIN_NT-6.1-WOW64 MINI 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin
% ruby --version
ruby 1.9.3p385 (2013-02-06 revision 39114) [i386-cygwin]
% ruby excel_open.rb Book1.xlsx
success
% ruby excel_open.rb Book1.xls
excel_open.rb:10:in `method_missing': (in OLE method `open': )
(WIN32OLERuntimeError)
    OLE error code:800A03EC in Microsoft Excel
      'Book1.xls' にアクセスできません。読み取り専用または暗号化されてい
ます。
    HRESULT error code:0x80020009
      Exception occurred.
        from excel_open.rb:10:in `<main>'
% cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

>ruby --version
ruby --version
ruby 1.9.3p385 (2013-02-06 revision 39114) [i386-cygwin]

>ruby excel_open.rb Book1.xlsx
ruby excel_open.rb Book1.xlsx
success

>ruby excel_open.rb Book1.xls
ruby excel_open.rb Book1.xls
success

非常に不思議なのは、cygwin上のzshから cmd.exe を呼び出して、
そこから実行するだけで開けるようになるという点です。

思いついたのは、cygwinのせいで環境変数が変わるせい、という点なのですが、
OLE呼び出しで環境変数の影響ってあるんでしたっけ?
なにか、分かることがありましたら、教えて頂けないでしょうか。

:= excel_open.rb =:

#!/usr/bin/ruby
# -*- coding: cp932 -*-

require 'win32ole'

infilename = ARGV.shift

fso = WIN32OLE.new('Scripting.FileSystemObject')
appl = WIN32OLE.new('Excel.Application')
book = appl.Workbooks.open fso.getAbsolutePathName(infilename)

if book
  puts 'success'
  book.Close(false)
else
  puts 'failed'
end

appl.Quit

:= end of excel_open.rb =:

-- 
Motomichi Matsuzaki, PhD <mzaki / e-mail.ne.jp>
Dept. of Biomedical Chemistry, Grad. Sch. of Medicine, Univ. of Tokyo, Japan