• ベストアンサー

バッチファイルでrubyの引数の*?をエスケープ

バッチファイルの中でruby に渡す引数の文字列の中のワイルドカードをエスケープするにはどうしたらいいでしょうか。例えば、 for %%I in (aa* b?b) do ruby hoge.rb %%I のような感じです。括弧内のそれぞれを、一つの文字列として渡したいのです。 Windows7 32 bit版または64bit版です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

不勉強ですみまっせん。WINDOWS環境ではrubyがワイルドカードを処理してしまうんでしたね。 >'a*' 'b*' >でよいのかと思いましたが、それではだめなようです。 直接rubyの引数にする場合はrubyマニュアルに書いてある通り、上記でよいのですがね。 ruby hoge.rb 'a*' 'b*' を実行してみると分かると思います。 ダブルクォートとシングルクォートを同時に使用するとうまくいかないようなので、以下のようにrubyに渡す際、シングルクォートだけ使えばうまくいくのではないでしょうか? === SET A=a* b* CALL :LOOP %a% GOTO :EOF :LOOP IF "%~1%"=="" GOTO LOOPEND ruby hoge.rb '%~1' SHIFT GOTO LOOP :LOOPEND GOTO :EOF ===

noname#214088
質問者

お礼

たしかにその方法で解決しました。ありがとうございました。

その他の回答 (2)

回答No.2

失礼しました、一部書きかけ途中で回答してしまいました。 一文字ごとなら === SET A=aa* b?b :loop if not defined a goto loopend ruby hoge.rb "%a:~0,1%" set a=%a:~1% goto loop :loopend === でどうでしょうか?

noname#214088
質問者

お礼

ご回答ありがとうございました。

回答No.1

何かrubyの質問ではない気がしますが。 「括弧内のそれぞれ」というのは、スペース区切りで「aa*」と「b?b」でしょうか? forを使うからエスケープが必要になるので、GOTO、CALL、SHIFTを使ったループだとエスケープ不要で何とかなるのではないでしょうか? 例えば、環境変数Aにデータを入れた場合、 === SET A=aa* b?b CALL :LOOP %a% GOTO :EOF :LOOP IF "%~1%"=="" GOTO LOOPEND ruby hoge.rb "%~1" SHIFT GOTO LOOP :LOOPEND GOTO :EOF === 一文字ごとに処理するなら、 === SET A=aa* b?b :loop if defined a ruby hoge.rb "%a:~0,1%" set a=%a:~1% goto loop === でどうでしょうか?

noname#214088
質問者

お礼

ご回答ありがとうございました。

noname#214088
質問者

補足

ご回答ありがとうございました。 意味は、「スペース区切りで「aa*」と「b?b」」です。 たしかに、二つの異なる問題をごっちゃにして質問していたようです。 aa* b?b この例の場合、ご回答の第一の方法でうまく行きました。しかし、これが a* b* のような場合だと、rubyがワイルドカード展開してしまいますが、それを回避するのにはどうしたらいいでしょうか。 'a*' 'b*' でよいのかと思いましたが、それではだめなようです。 #hoge.rb puts ARGV[0] 'a*' となってしまいます。

関連するQ&A