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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

5659閲覧

コマンドファイルの実行がフォームアプリケーション側からだと中断される

gamu

総合スコア31

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/04/18 21:36

編集2017/04/18 21:39

あるコマンドファイル「Mother.CMD」があります。

内容は以下の通り

start /wait HogeThirdParty.exe /B /cmdfile=Child.CMD

これを私がダブルクリックして開くと、cmd.exeが立ち上がり、HogeThirdParty.exeがChild.CMDのコマンドを受け付けて、10秒程かけて正常に処理を終了し、目的のファイル「HogeExport.txt」を同じディレクトリに生成します。
「Child.CMD」の内容は以下の通り

Import /HogeData Hoge.hoge SaveSrc /file=HogeExport.txt End

しかしVBのフォームアプリケーションで同じ動作をさせようとすると、
cmd.exeが2秒程で閉じ、「終了しました」のメッセージボックスが表示します。

VBのコードは以下の通りです。

If ExecuteFlag = True Then 'ファイルを開く Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("C:\Users\myname\Documents\Visual Studio 2015\Projects\実験\obj\Release\Mother.CMD") '終了するまで最大10秒間だけ待機する p.WaitForExit(20000) '終了したか確認する If p.HasExited Then MessageBox.Show("終了しました。") Else MessageBox.Show("終了していません。") End If End If

原因を解明するにはどのような知識が必要でしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://dobon.net/vb/dotnet/process/openfile.html
こちらのサイトを見ると、作り的には問題なさそうですね。
ということは実行しているコマンドに問題がありそうです。
まずは他のコマンドで正しく実行できるか、終了するまで正しく待てるかというのを確認しましょう。
次のコマンドで10秒待てるか試してみてください。
ping -n 10 localhost
これで問題がなければMother.CMDの問題です。
コマンドの内容としては、ファイル操作ぽいので、コマンドで使われるファイルが正しく参照できているかなどを確認してください。
特に気になるのはProcess.Startで指定しているコマンドは絶対パスなのに、コマンド内の/file=HogeExport.txtで指定しているパスが相対パスになっていることです。
/file=C:\Users\myname\Documents\Visual Studio 2015\Projects\実験\obj\Release\HogeExport.txtとしたらどうでしょうか。

投稿2017/04/19 00:02

ttyp03

総合スコア16998

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

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

gamu

2017/04/19 19:02

ずばりその通りでした。迂闊でした。 ping -n 10 localhostは問題なく動作。 Child.CMDのファイルパスを絶対パスに指定すると、手動、VB,両者とも動作できました。 どうもありがとうございました。
guest

0

  1. Mother.CMD の内容を次のように変えたらどうなりますか?
echo "Hello World!" pause

これでうまくいかなければ、原因は Mother.CMD に無く、VB 部分のせいだということがわかります。うまくいけば、スクリプト側に責任があることがわかります。

  1. p.WaitForExit(20000) は 2000 でなく 20000 になっていますか?

「2 秒ほど」という記述が気になります。cmd.exe が起動しているなら、Process.Start() は仕事をしているということですが、p.WaitForExit(2000) はそれを 2 秒だけ待つという意味になります。

投稿2017/04/18 22:50

Zuishin

総合スコア28660

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

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

gamu

2017/04/19 18:57

VBからの"Hello World!"の 実行に成功しました。 p.WaitForExit(20000)は記述通り、20秒の設定になっていました。 コメントと整合とれてなくてややこしくてすみません。 2秒というのは、アプリケーションが起動するも相対パスのファイルを指定した為に処理が中断されてしまったために起こった結果だったようです。 ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問