• ベストアンサー

コマンドを実行してコマンドライン文字列を読み込む

C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか? コマンドを実行したプログラム内の変数に文字列として保持して、処理したいと考えています。 Windowsです。 よろしくお願い致します。

  • yzn
  • お礼率40% (17/42)

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

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

外部コマンド実行のしっかりしたサポートがある言語を選ぶのがいいと思いますが、Cプログラム中から外部コマンドを呼び出したいというなら。。。 できるだけ、C言語から逸脱せずにやろうとすると、コマンド実行は system() 関数で実行できて、かつ、"> filename" をつけてコマンド結果をファイルにリダイレクトできることを仮定すれば、以下のような感じになりますかね。 あと、エラー処理などいっさいしていないことや、文字数の数え方を端折っていますので、適当に修正してください。 コマンド実行結果の格納に何文字いるかは、きっちりやろうと思えば、一度、fseek() などしないで、 ・ファイルを実際読み込んでカウントし、rewind() するか、 ・ファイルを読み込みながら、文字を格納している領域を拡張する ということをします。ここでは、ファイルサイズよりは大きくならないだろう(たとえば、改行文字の変更などにより小さくはなっても大きくならない)と仮定してファイル位置から文字数を推定しています。 ===== #include <stdio.h> #include <stdlib.h> #include <string.h> char *execute(const char *cmd) { static char *cmdbuf = NULL; static size_t bufsiz = 0; static char fn[L_tmpnam]; const char *redirect = " > "; size_t siz; tmpnam(fn); if ((siz = strlen(cmd) + strlen(redirect) + strlen(fn) + 1) > bufsiz) cmdbuf = realloc(cmdbuf, bufsiz = siz); strcpy(cmdbuf, cmd); strcat(cmdbuf, redirect); strcat(cmdbuf, fn); system(cmdbuf); return fn; } char *result(const char *fn) { long fsiz; char *rv, *p, c; FILE *fp = fopen(fn, "r"); fseek(fp, 0, SEEK_END); fsiz = ftell(fp); rv = p = malloc(fsiz + 1); rewind(fp); while ((c = getc(fp)) != EOF) *p++ = c; *p = '\0'; fclose(fp); remove(fn); return rv; } int main(int argc, char *argv[]) { int i; for (i = 1; i < argc; ++i) { char *str = result(execute(argv[i])); printf("%s\n", str); free(str); } } === Usage: program command1 command2 ...

その他の回答 (4)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.5

もうひとつ訂正: main()の最後に   return 0; をつけておいてください(C++ を書くほうが多いせいで、常に 0 を返す場合は、つい省略してしまう^^;)。 プログラム内で、エラーチェックを全然してないので、ほんとにエラーが起きていないかどうかはわかりませんが(笑)

yzn
質問者

お礼

丁寧に教えていただき、ありがとうございました。 参考にさせていただき、なんとか期待通り動くようになりました。 やはり、VBSとかケースバイケースで便利なものを使い分けられるように覚えなければいけませんね・・・ 勉強します!

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

訂正:result() という関数内の   char *rv, *p, c; を   char *rv, *p;   int c; に修正しておいてください。たぶん、そのままでも動作すると思いますが、char が符号無しだったらまずいかも^^ 失礼しました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

その実行結果は標準出力に出てくるのでしょうか? もしそうで、かつ「どんな言語」でも。というのなら $result = `command`; とかできちゃうPerlとかRubyがありますが。 C/C++ということなら、実行するコマンドと双方向でやりとりするのでなければ popen が使えます。 Win32API でごりごりやるとか、Unixみたいに無名パイプをpipe()でつくって とかでもいいですけど。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・コマンドラインで実行した結果をファイルに保存。→リダイレクション機能。  その後プログラムから保存された実行結果のファイル内容を読み込めば利用は出来ます。 >C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか?  ↑  fopen、fgets、fclose 関連を使って下さい。 ・以上。

関連するQ&A

  • 変数内のコマンドの実行コマンド文字列の表示

    変数内のコマンドの実行コマンド文字列の表示 DIG=`dig ドメイン` として変数内のコマンド実行結果を printf "$DIG\n"と表示させることはできるのですが、 実際に実行したコマンドを表示させることはできますでしょうか。 逆に DIG="dig ドメイン" として文字列をセットすればコマンド内容は表示されますが、 今度はコマンドとして実行させる方法がわかりません。 `$DIG`としてもprintf "$DIG\n"などいろいろ試しましたが わかりません。。 どなたかおわかりでしょうか

  • 大文字の文字列→小文字の文字列

    C言語初心者です。 ある演習問題をやっていて詰まっています。 自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。 ・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。 ・ポインタ変数を使う。 ・continue文を使う。 ・標準ライブラリ関数は使わない。 です。 ・continue文というのがよくわからない。 ・宣言した関数でどの処理をすればいいのかわからない。 ・大文字を小文字にするというプログラムがわからない。 (アスキーコードをどう使うのか) でつまっています。 どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。 よろしくお願い致します。

  • C言語 コマンドラインの文字列を調べる方法

    はじめまして。 C言語を学習しています。 PCのOSはWindows XPです。 参考書に、アプリケーションの動作を指定するオプションを指定する方法として、下記の説明とプログラムが載っています。 以下の点でつまづいており、ご教示をお願い致します。 1、プログラム実行結果画面(コマンドプロンプトのような黒い画面。スクリーンショットを添付しております。)に【-a】と入力しようとしましたが、テンキーの【-】を押した時点で画面が消えてしまいます。 どのように操作すれば、参考書のような実行結果が得られるのでしょうか。 2、【argc--;】の部分で、ここでなぜデクリメントを使うのでしょうか。 3、argvは文字配列へのポインタ変数とのことですが、if文のところの【argv[argc][0]】が何を意味しているのか教えてください。 argv[配列の要素]のような書き方ではなく、argvの横に[]が2つある時点で混乱してしまいます。 どうかよろしくお願い致します。 ●参考書による説明 一般的に、コマンドラインにはファイル名の他に、アプリケーションの動作を指定するオプションを指定することがあります。 例えば、Windowsでファイル名を指定して実行で defrag と指定して起動すると、デフラグが起動して何もせずに終了しますが、 defrag c: と指定すると、Cドライブのデフラグを開始します。 また、defrag c: -a と指定すると、Cドライブの分析結果だけを表示します。 このような使い方は、パソコン上級者にはおなじみのやり方です。 この例では、 c: と -a という2つの文字列がコマンドラインに渡され、それをアプリケーション内で解析して、動作を決定しています。 同様のことは、コマンドラインの文字列を調べれば簡単にわかります。 ここでは、-a と -s というオプションの有無を解析する例です。 ●プログラム #include <stdio.h> int main(int argc,char *argv[]) { while (argc > 0) { argc--; if (argv[argc][0] == '-') { if (argv[argc][1] == 'a') printf("-a オプション\n"); if (argv[argc][1] == 's') printf("-s オプション\n"); } } return 0; } このプログラムに -a -s というオプションを与えて実行した結果は次の通りです。 -a オプション -s オプション 同様にすれば、いくつのオプションにでも対応することができます。 また、先頭が - ではない文字列をファイル名として扱うようにすれば、 ファイル名も前項と同様に取得することができます。

  • DOSコマンドで結果として出力される文字列を変数に格納したい

    DOSコマンドで、あるソフト(タスク)が実行されていればプログラムAを、そうでなければプログラムBを実行するバッチを組んでいます。タスクの一覧はtasklistで取得できることが分かり、対象となるタスクおみを抽出する方法も分かりました。しかし、この後どうすれば良いかが分かりません。対象となるタスクが存在した場合としない場合では出力される文字列が違います。この文字列を比較することで分岐が実現できると思ったのですが、それには文字列を変数に格納する必要があります。以下のように記述し、うまくいくことを期待したのですが、駄目でした。 set STATUS=tasklist /fi "Imagename eq タスク名" tasklist /fi "Imagename eq タスク名"の部分が関数であれば、戻り値があってそれを格納することができるのではないかと思ったのですが、できませんでした。このケースに限ったことではありませんが、各コマンドの実行結果として出力される文字列を変数に格納するにはどうすれば良いのでしょうか?VBSやWSHなどではなく、.bat形式の場合でお願いします。

  • コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法

    はじめまして。 Linux(ディストリビューションは問わず)で コマンド(例えばlsコマンド)を実行して その出力結果を文字列で取得するプログラムを作成したいです。 コマンドの実行はsystem()で可能なのかな?と思っていますが、 コンソールに出力される内容はどのように取得して良いのか分かりません。 詳しい方がおりましたらご教授お願い致します。

  • コマンドラインからPHPを実行するには。(Windows)

    PHPスクリプトをコマンドライン上で実行しようと思い、 >php bookread.php と入力したところ、 >'cdc:\' は、内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と表示されてしまいます。 おそらく環境変数の問題か、もしくは実行しようとしたディレクトリがいけないのかと思いますが、どうしたらよいのかわかりません。 Windowsで、OSはwinXP、また、phpはxamppで取得しました。 実行しようとしたファイルbookread.phpは c:\xampp\htdocs\_test というフォルダの中にあります。 どのディレクトリに移ってから行えばよいのか、もしくは環境変数にどう書き加えればよいのか、教えてください。 私が実行を試したディレクトリは、 c:\xampp\htdocs\_test> と c:\> です。 (ブラウザ上で他のPHPスクリプトを実行することは可能です。)

    • 締切済み
    • PHP
  • バイナリファイルから文字列を検索するコマンド

    C++言語で書かれたプログラムの実行ファイルが50個ほど あり(それぞれ50MB程度)、ある関数を修正した場合に どの実行ファイルに影響があるか調べたいのですが、 ソースコードを追って依存関係を調べるのは現実的ではないため 実行ファイルの中にその関数名が含まれるかどうかで 判断しようと思っております。 ためしにFTPでパソコン上に転送して、バイナリエディタで表示し 使用している関数名が文字列として含まれていることは 確認できましたが、毎回全ファイルをFTP転送するのは避けたいので、 同様の調査をUNIXマシン上で行いたいのですが、 バイナリファイルから文字列を検索するコマンドは ありますでしょうか? OSは SUN OS5.8です。 宜しくお願いします。

  • C言語でUnicodeの文字列を扱う正しい方法が知りたいです。

    C言語でUnicodeの文字列を扱う正しい方法が知りたいです。 例えば、変数の中に格納された文字列が「a=3」かつ、文字列が「test」であれば処理を実行するといったプログラムの場合、 int a; a = 3; TCHAR file1[128]; file1 = TEXT"test"; if(a = 3 && file1 = TEXT"test"){//実行する処理}; のような形を考えましたが、エラーは出ないものの処理が実行されずに素通りしてしまいます。。 環境はVisual C++ 2008 Expressで、種類はコンソールプログラムではなく、GUIを持ったWindowsプログラムです。 どこを間違えているのでしょうか?

  • コマンドラインの長さに制限はある?

    Windowsでプログラムを実行する時に、コマンドライン引数を渡す事ができますよね。例えば「myprogram.exe」というプログラムを実行する時に、 myprogram /help と言う風に「/help」を付けると、この文字列がそのままWinMain関数の第三引数「LPSTR strCmdLine」に渡されます。 そこで質問ですが、このコマンドライン引数の長さに制限はあるのでしょうか?

  • コマンドライン引数

    コマンドラインから文字列として取得して、 ほかの変数に文字列として入れたいのですが、どうしたらいいですか?

専門家に質問してみよう