私はboost::program_options
を使用して私のコマンドラインを解析しています。今、私は、例えば、すべての行にコマンドラインオプションを含む、ファイルを表す--script
引数によって、バッチ実行のサポートを追加してい:C++:文字列をコマンドライン引数に分解する(解析しない)方法は?
--src="\"z:\dev\veds\sqlexpress\Run 1.ved\"" --src-kind=bla --yz
--src=z:\dev\veds\sqlexpress\db.ebf
--src=z:\dev\veds\sqlexpress\db2.mdf
--src=db3
--src="\"z:\dev\veds\sqlite\Run 41 (Run 23).ved\""
--src=z:\dev\veds\sqlite\ws_results_db_2012_01_15_18_37_03.db3
--src=z:\dev\veds\mysql\10.ved
--src=z:\dev\veds\mysql\db
ファイルの各行には、私のツールの単一の実行を表し、この特定の実行のコマンドラインオプションを一覧表示します。
問題は、スクリプトファイルを読むと完全な行が得られ、個々のコマンドラインオプションに分割されないことです。しかし、boost::program_options
を使用するには、argc
とargv
が必要です。つまり、コマンドラインを別のオプションに分割することに依存します。
一部の値には空白が含まれているため、二重引用符で囲まれており、二重引用符で囲まれています。
一方、高価なブートストラップのために、OSコマンドプロンプトから各コマンドラインオプションのツールを実行する必要はありません。これは最初にスクリプト機能を導入した理由です。
OSと同じ方法で行をコマンドライン引数に分割する簡単な方法はありますか?
ありがとうございました。
どのような混乱!バックスラッシュはエスケープ文字の後に引用符が続きますが、その後に引用符が続く場合のみです。文字列の最後に引用符の直前にバックスラッシュがある場合はどうなりますか?私は元のデータが実際にあなたが与えるログファイルスニペットから回復可能であるとは思わない。 –
プラットフォーム固有のソリューションを受け入れる場合、[CommandLineToArgvW](http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391%28v=vs.85%29.aspx)があります。さもなければ、ネットを検索するにはコマンドラインからargvに行くための多くの解決策があります。 –
皆、これは非常に実際的な例です。ウィンドウシェルはバックスラッシュを気にしないので、アプリケーションにそのまま渡します。文字列は 'boost :: filesystem :: path'に入力されます。これは、スペースを入れるために明示的に引用する必要があります。したがって、エスケープ文字をエスケープ文字として解釈するのは、 。 – mark