ページ 11

system関数が正しく動かない

Posted: 2013年1月09日(水) 22:41
by blade
system関数を使って外部コマンドを呼び出して実行プログラム(a.exe)内で別のプログラムを実行させたいと考えています。
カレントディレクトリ外にあるプログラム(betsu.exe)を実行したいのですが、その起動にはそのプログラムがあるディレクトリとは別のフォルダのいくつかのファイルを展開してから起動しなければなりません。
その数が多いのでプログラム内でコマンドcdでbetsu.exeのあるディレクトリに移動してbetsu.exeを実行したいと考えています。

コード:


#include <stdio.h>
#include<stdlib.h>
int main(void)
{
	system("cd C:/Users/blade/Desktop/betsu");
   system("cd"); //現在どこにいるか確認
   system("betsu.exe");
	return 0;
}
このプログラムを実行形式にして実行させてもbetsu.exeは実行されません。
むしろ、7行目のcdで現在位置を調べると上のcソースが置いてあるディレクトリにいることになっています。
当然次の行のbetsu.exeは実行されませんが、
どうして6行目のディレクトリ移動は正しく行かないのでしょうか。

・カレントディレクトリ(ここでa.exeを実行) C:\Users\blade\documents\visual studio 2010\Projects\0109\debug
・betsu.exeの場所 C:\Users\blade\Desktop\betsu
・上のcソースが置いてある場所 C:\Users\blade\documents\visual studio 2010\Projects\c\tekitoa

Re: system関数が正しく動かない

Posted: 2013年1月09日(水) 22:54
by h2so5
system関数でのコマンドの実行は独立しています。
つまり、system関数を呼び出すごとにカレントディレクトリはリセットされてしまうということです。

一番簡単な解決方法は & を使ってコマンドを連続で実行することです。

コード:

system("cd C:/Users/blade/Desktop/betsu & betsu.exe");
ちなみにWindowsでは & ですが UNIX環境では ; を使います。

参考URL:
system関数について | C・C++のQ&A【OKWave】
DOS equivalent for unix semi-colon to execute multiple commands

Re: system関数が正しく動かない

Posted: 2013年1月10日(木) 00:49
by ISLe
コマンドプロンプト(cmd.exe)限定かもしれませんが、コマンドの連結には&&、||も使えます。
&&は前のコマンドがエラー終了すると次のコマンドを実行しません。
||は前のコマンドがエラー終了しても次のコマンドを実行します。

(追記)
||は前後のコマンドを並列に実行するようです。

Re: system関数が正しく動かない

Posted: 2013年1月10日(木) 01:38
by blade
ありがとうございます。過去に同じ質問があったのですね、調査不足でした。
&でつないだらできました。

Re: system関数が正しく動かない

Posted: 2013年1月10日(木) 01:41
by blade
ありがとうございます。
&&でつないだほうがエラーが起きた時に対応できるので便利なのですね。
補足までいろいろ教えていただきありがとうございました。