0

Ruby を使用して、コマンド ライン引数を取るコードを実行しています。今、私は異なるオプションで同じプログラムを使用しようとしているので、オプションをファイルに入れています。プログラムが各行を読み取ってオプションを解釈し、それに応じてプログラムを実行するようにします。

しかし、私はこのエラーが発生します。"C:/Ruby193/lib/ruby/1.9.1/optparse.rb:1348:in block in parse_in_order': undefined methodshift' for "--c execue --query unix --Servername abc123":String (NoMethodError)"

ファイルを読み取り、行を文字列として扱うことを理解しています。しかし、このシフトエラーを克服し、コマンドプロンプトで入力されたかのように行を処理する方法があるかどうか疑問に思っています. またはより良い解決策。

これが私のコードです。

require 'optparse'
require 'micro-optparse'
# --command execue --query unix command --Servername abc123
f =File.open("list_of_commands.txt", "r")
f.each_line { |line| 
line= line.chomp
#line = "--c execue --query unix --Servername abc123"
#line = eval("\"#{line}\"")
puts line

 options = {}
OptionParser.new do |opts|

  opts.on("-c", "--command result,execue,chart,scpfile", String, "Single command to execute ") do |c|
    options[:comd] = c
  end

  opts.on("-q", "--query remote command, unix command", String, "performs the command on local or remote machine") do |q|
    options[:query] = q
  end

  opts.on("-s", "--servername CHSXEDWDC002 ", String, "server name to execute the command") do |v|
    options[:hname] = v
  end

    opts.on_tail('-h', '--help', 'Show this message') do
    puts opts
     exit
   end

 end.parse!(line)
 p options
 }

ファイルの内容は以下 --c execue --query unix --Servername abc123

私も micro-optparse を使用しようとしましたが、同じエラーに直面しています。回避策はありますか?

更新: 「@mu is too short」からの提案に従って、以下のオプションを試しました。end.parse!("#{Shellwords.shellsplit(行)}") および/または end.parse!(Shellwords.shellsplit(行))。しかし、どれも機能しませんでした。

また、「line = line.split("\t")」と end.parse!(line) を使用して行を配列として分割しようとしました。--c execue --query unix --Servername abc123 として出力

しかし、今ではブロックとしてエラーが発生します:無効なオプション --c execute

更新: #2 エラーを見ると、問題は間違ったパラメーター (-c) にありますが、Array .

更新: 3 配列の受け渡しは、-c などの短い形式の引数に対してのみ機能しましたが、長い形式が指定された場合、無効な引数エラーで失敗しました。

optparse に関するドキュメントはあまりありません。マイクロパースも試しましたが、デフォルトの値が必要で、オプションではありません:(

4

2 に答える 2

2

このparse!メソッドは、文字列ではなく配列を引数として必要とします。引用符などを処理する必要がある場合に備えて、配列に変換するのShellwords.shellsplitではなくString#split(または同様の手巻き方法) を使用することをお勧めします。lineこのようなもの:

OptionParser.new do |opts|
  #...
end.parse!(Shellwords.shellsplit(line))
于 2013-04-24T22:00:43.240 に答える