1

この構文で呼び出されるスクリプトを作成したい:

script.rb [common-options] arg1 [arg1-options] [arg2 [arg2-options] …]

例えば:

script.rb --verbose --dry-run a1 --outfile c1 a2 --reprocess --outfile c2 a3 a4 --outfile b42

私のコードにこのようなものを返す:

options = {verbose: true, :'dry-run' => true}
args = {
  'a1' => {outfile: 'c1'},
  'a2' => {outfile: 'c2', reprocess: true}, 
  'a3' => {},
  'a4' => {outfile: 'b42'},
}

OptionParser のドキュメントから、それが可能かどうかはわかりません。

誰かがこれに対する解決策を知っていますか?

4

1 に答える 1

1

最後に、「ruby​​ の OptionParser を使用してサブコマンドを解析する」で解決策を見つけました。

order最初の位置引数までのオプションのみを解析する、文書化が不十分な方法を使用する必要があります。parseARGV 全体を解析します。

require 'optparse'

options = {}
filenames = []
file_options = Hash.new do |hash, key| hash[key] = {} end
filename = nil

file_parser = OptionParser.new do |o|
  o.banner = 'Options for every file (goes after every filename):'
  o.on '-o', '--outfile=FILE', 'A file to write result to' do |arg|
    file_options[filename][:outfile] = arg
  end
end

global_parser = OptionParser.new do |o|
  o.banner = [
    "Super duper file processor.\n",
    "Usage: #{$PROGRAM_NAME} [options] file1 [file1-options] [file2 [file2-options] …]",
  ].join("\n")
  o.separator ''
  o.separator 'Common options:'
  o.on '-v', '--verbose', 'Display result filenames' do |arg|
    options[:verbose] = arg
  end
  o.on '-h', '--help', 'Print this help and exit' do
    $stderr.puts opts
    exit
  end
  o.separator ''
  o.separator file_parser.help
end

begin
  argv = global_parser.order(ARGV)
  while (filename = argv.shift)
    filenames.push(filename)
    file_parser.order!(argv)
  end
rescue OptionParser::MissingArgument => e
  $stderr.puts e.message
  $stderr.puts global_parser
  exit 1
end

if filenames.empty?
  $stderr.puts global_parser
  exit 1
end

次のようにスクリプトを実行すると:

script.rb -v a -o a.out b c d -o d.out

私は手に入れます:

options      = {:verbose=>true}
file_options = {"a"=>{:outfile=>"a.out"}, "d"=>{:outfile=>"d.out"}}

そして、このヘルプ テキストが生成されます。

Super duper file processor.

Usage: script.rb [options] file1 [file1-options] [file [file2-options]…]

Common options:
    -v, --verbose                    Display converted filenames
    -h, --help                       Print this help and exit

Options for every file (goes after every filename):
    -o, --outfile=FILE               A file to write result to
于 2017-03-20T15:25:29.607 に答える