質問: ### 前提・実現したいこと 受け取ったコマンドライン引数を列挙するCプログラムがあり、batファイル内でそのCプログラムに引数を渡し実行したいのですが、引数にスペースが含まれる場合の処理に困っています。 ### 発生している問題・エラーメッセージ [1] スペースを含むパスを変数に格納し、Cプログラムにその変数を引数として渡した場合、そのまま渡すとスペースの部分で変数の中身が分割されてしまいます。 [2] しかし変数を渡すときにダブルクォーテーションで囲むと、なぜかその変数以降の引数まで合わせてひとつの引数と認識されてしまいます。 なにか解決方法はありますでしょうか。 ``` [1]の場合の結果 0: a 1: C:\test 2: files\ 3: 2 4: 3 [2]の場合の結果 0: a 1: C:\test files\ 2 3 ``` ### 該当のソースコード batファイルの場所:C:\test files\ a.exe ``` #include int main(int argc, char *argv[]){ int i; for(i=0; i
回答: otnさんのコメントから「WindowsではexecutableのCランタイムにより引数の解釈が変わる」という点がようやく実感できた気がします。以下の回答の前提は**cygwin64上のgcc 6.3.0で作成したexecutable**です。あまり一般的とはいえないかもですね。 to:質問者さん どのコンパイラー(どのCランタイム)かにより違うということだと思います。それを明確にしたほうがよさそうですね。 `set path=%~dp // カレントディレクトリのパス(スペースが含まれる)` バッチファイルに%~dpと書いてやってみたのですがパス演算子が間違って使われてますというエラーになり、どうやったらこの記述が動くのか自分にはわかりませんでした。そこでバッチファイルが存在するディレクトリーなのだろうと解釈し`%~dp0`に置き換えてやってみました。(Windows10 64bit) で、内容がバックスラッシュで終わっている変数を一つの引数として渡す場合、ダブルクォート文字ではなくシングルクォート文字で囲むといいみたいです。 `a.exe '%変数名%' arg2 arg3 ...` ただotnさんのコメントを拝見すると、この方法が正しいかどうか少々自身ないです。コンパイラーのランタイムによってコマンドの引数の解釈が変わってくる(!)ということがどういう理屈か自分に分かっていないからです。自分はcygwin64のgccでa.exeを作成し、それをコマンドプロンプト上で動かすという少々ヘンテコなことをしています。