いつもお世話になっております。
現在のプログラムから外部プログラムを呼び出す際、外部プログラムが
読み込むテキストファイルを指定して起動させるプログラムを作成中です。
全てのファイルを同じフォルダーにおいておけばうまくいくのですが、
読み込むテキストファイルが別のフォルダーにある場合、外部プログラム
は立ちあがるのですが、ファイルは読み込みません。(エラーは無し)
WorkingDirectoryを設定すると余計ややこしくなります。
PGM2.EXEのテキストファイルはコマンドライン引数読み込み方式です。
何の指定が間違っているのかまた欠けているのかが判らない状況です。
フォルダーと実行ファイルの関係は以下の通りとします。
実行ファイルは
自分プログラム(PGM1.EXE) D:\Debug にある
外部プログラム(PGM2.EXE) D:\Debug にある
PGM2.EXEが読み込みたいファイルは
DATA.TXT D:\Doc にある
宜しくお願いします。
C#
1// PGM1.EXE のソースの中で 2ProcessStartInfo pInfo = new ProcessStartInfo(); 3pInfo.UseShellExecute = true; //この意味もイマイチ? 4pInfo.FileName = "PGM2.EXE"; 5//pInfo.WorkingDirectory = @"D:\Doc";//これもイマイチ 6pInfo.Arguments = "DATA.TXT";// フルパス指定でも読み込まない 7Process.Start(pInfo);
フルパスで指定しても読み込まないなら、PGM2 が悪い。
PGM2 がちゃんと起動できるかどうかを PowerShell なりコマンドプロンプトなりから確かめるのが先です。
Zushinさん、ありがとうございます。
PGM2は読み込んだDATA.TXTファイルを表示して起動するプログラムです。
PGM1からPGM2が立ち上がるのは確認できていますが、DATA.TXTを
読み込んでないです。全て同じフォルダーならうまくいくのですが・・

> フルパス指定でも読み込まない
空白を含んでいるとか?
SurferOnWwwさんありがとうございます。
ファイル名、パスに空白は含んでおりません。
WorkingDirectoryはPGM2の場所指定と思います。また、Argumentsにフルパスでファイル指定すると
理屈では読み込むはずと思ってはいます。ただ、PGM1にもコマンドライン引数でIDE(VS2019)で
設定(プロジェクトのデバッグTAB)した場合、作業ディレクトリは読み込むテキストファイルの
ディレクトリで、コマンドライン引数の指定でフルパス指定しても読み込まない現象と似ている
ように思うのですが・・

とりあえず、PGM1からフルパスを渡してみてPGM2に受け取ったパスをコンソールに吐き出させてみては。
それで正しいパスが出ているなら、PGM1には問題ないでしょうし、タイトルと別の所が原因な気がします。(PGM2のファイル処理が怪しい)
問題解決に重要なのは、やりたい事を実行するまでの経路を把握する事と、その経路のどこまで正しく進めているか、原因の切り分け・絞り込みを行う事です。
> PGM1からPGM2が立ち上がるのは確認できていますが、DATA.TXTを
そうじゃなく、PowerShell からフルパスで引数を渡して PGM2 を起動し、DATA.TXT を読み込むかどうかをまず確認してください。
それで正常に動くなら正しいワーキングディレクトリと引数が確定できるので、PGM1 をいじるのはそれからです。
外部プログラム(PGM2.EXE)はどの言語で作られていますか?
C#やC++とかみたいな言語ならいいですが、Pythonとかのスクリプト系の言語とかだと場合によって変わってきますから。
pythonでも単純にwrapして実行ファイルにするだけのツールを使えばexeにできますし。
その場合はPythonとかが必要です。
Zuishinさんありがとうございます。
PowerShellからフルパス+PGM2.EXE フルパス+DATA.TXTで呼び出すと正しく読み込まれて
立ち上がりました。
因みに DATA.TXT はPGM2の直下にフォルダーを作りそこに入れなおしてフルパス指定しました。
ご指摘のようにPGM1の指定をもう少し見てみます。
BeatStarさんありがとうございます。
PMG1とPMG2 はほぼ同じようなプログラムで
どちらもC#製です。PGM1で出力したPGM2用のテキストファイルを
PGM2で読み込んで表示させようとしています。
テキストファイルはコマンドライン引数としてEnvironment.GetCommandLineArgs()
を使用し配列に読み込ませています。
Zuishinさん、SurferOnWwwさん、radianさん、BeatStarさん、アドバイスありがとうございました。
私の基本的な知識不足でした。ご指摘頂いたPowerShellのアドバイスでフルパスでPGM2を呼び出す
テストがヒントになりpInfo.FileName="PGM2.EXE"をフルパスにしたところうまくいきました。
2つのEXEが同じ場所であってもフルパスが安全とわかりました。

回答1件
あなたの回答
tips
プレビュー