質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1803閲覧

Process.Start()で外部プログラムのコマンドライン引数を読み込まない 指定方法が良くわからない

mnhktm

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/10/31 00:24

いつもお世話になっております。
現在のプログラムから外部プログラムを呼び出す際、外部プログラムが
読み込むテキストファイルを指定して起動させるプログラムを作成中です。

全てのファイルを同じフォルダーにおいておけばうまくいくのですが、
読み込むテキストファイルが別のフォルダーにある場合、外部プログラム
は立ちあがるのですが、ファイルは読み込みません。(エラーは無し)
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);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/31 00:27

フルパスで指定しても読み込まないなら、PGM2 が悪い。 PGM2 がちゃんと起動できるかどうかを PowerShell なりコマンドプロンプトなりから確かめるのが先です。
mnhktm

2021/10/31 00:39

Zushinさん、ありがとうございます。 PGM2は読み込んだDATA.TXTファイルを表示して起動するプログラムです。 PGM1からPGM2が立ち上がるのは確認できていますが、DATA.TXTを 読み込んでないです。全て同じフォルダーならうまくいくのですが・・
退会済みユーザー

退会済みユーザー

2021/10/31 00:43

> フルパス指定でも読み込まない 空白を含んでいるとか?
mnhktm

2021/10/31 00:54

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

退会済みユーザー

2021/10/31 01:21 編集

とりあえず、PGM1からフルパスを渡してみてPGM2に受け取ったパスをコンソールに吐き出させてみては。 それで正しいパスが出ているなら、PGM1には問題ないでしょうし、タイトルと別の所が原因な気がします。(PGM2のファイル処理が怪しい) 問題解決に重要なのは、やりたい事を実行するまでの経路を把握する事と、その経路のどこまで正しく進めているか、原因の切り分け・絞り込みを行う事です。
Zuishin

2021/10/31 02:51

> PGM1からPGM2が立ち上がるのは確認できていますが、DATA.TXTを そうじゃなく、PowerShell からフルパスで引数を渡して PGM2 を起動し、DATA.TXT を読み込むかどうかをまず確認してください。 それで正常に動くなら正しいワーキングディレクトリと引数が確定できるので、PGM1 をいじるのはそれからです。
BeatStar

2021/10/31 04:12

外部プログラム(PGM2.EXE)はどの言語で作られていますか? C#やC++とかみたいな言語ならいいですが、Pythonとかのスクリプト系の言語とかだと場合によって変わってきますから。 pythonでも単純にwrapして実行ファイルにするだけのツールを使えばexeにできますし。 その場合はPythonとかが必要です。
mnhktm

2021/10/31 08:00 編集

Zuishinさんありがとうございます。 PowerShellからフルパス+PGM2.EXE フルパス+DATA.TXTで呼び出すと正しく読み込まれて 立ち上がりました。 因みに DATA.TXT はPGM2の直下にフォルダーを作りそこに入れなおしてフルパス指定しました。 ご指摘のようにPGM1の指定をもう少し見てみます。
mnhktm

2021/10/31 07:55

BeatStarさんありがとうございます。 PMG1とPMG2 はほぼ同じようなプログラムで どちらもC#製です。PGM1で出力したPGM2用のテキストファイルを PGM2で読み込んで表示させようとしています。 テキストファイルはコマンドライン引数としてEnvironment.GetCommandLineArgs() を使用し配列に読み込ませています。
mnhktm

2021/10/31 10:34

Zuishinさん、SurferOnWwwさん、radianさん、BeatStarさん、アドバイスありがとうございました。 私の基本的な知識不足でした。ご指摘頂いたPowerShellのアドバイスでフルパスでPGM2を呼び出す テストがヒントになりpInfo.FileName="PGM2.EXE"をフルパスにしたところうまくいきました。 2つのEXEが同じ場所であってもフルパスが安全とわかりました。
guest

回答1

0

自己解決

アドバイスいただきありがとうございました。
PowerShellのコマンドプロンプト呼び出しで PGM2 DATA.TXT 共にフルパス指定で
正しく読み込まれてPGM2が起動できた事を確認しましたので、上記ソースで
pInfo.FileName ="PGM2.EXE" にフルパス指定となるよう追加すると正しく動作
しました。変更の詳細は以下の通りです。
単に私が基本的なことが判らなかったのかもしれません。なんとか動作しましたので
解決といたします。ありがとうございました。

C#

1// PGM1 のソースの中で 2ProcessStartInfo pInfo = new ProcessStartInfo(); 3string ExeDir = Directory.GetCurrentDirectory()// ◎ カレントディレクトリ情報取得を追加 4pInfo.FileName = ExeDir +"\"+ "PGM2.EXE";   // フルパス指定になるようExeDirを追加  5pInfo.WorkingDirectory = @"D:\Doc";        //DATA.TXTのパス 6pInfo.Arguments = "DATA.TXT"; // テキストファイル名のみ 7Process.Start(pInfo); 8

投稿2021/10/31 10:26

mnhktm

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問