DOBON.NETプログラミング道掲示板
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[ スレッド内全2レス(親記事-2 表示) ] <<
0
>>
■35573
/ 親記事)
Processクラスからbatファイル実行後、KILLできない
▼
■
□投稿者/ あばば無人君
一般人(1回)-(2024/01/13(Sat) 05:19:30)
環境/言語:[Windows10(64bit/Home/22H2)、NET Framework-4.8.1、C#]
分類:[.NET]
約3年ぶりの投稿となります。宜しくお願いします。
掲題の件ですが、WinFormアプリを新規で用意し、
画面に開始ボタン(button1)と停止ボタン(button2)を配置しました。
開始ボタンを押下するとProcessクラスでbatファイルを実行し、
その処理が終わる前に停止ボタンを押下するとProcessクラスの
KILLを実行して強制終了させる、というシンプルなアプリです。
その実装は以下となります。
001 public partial class Form1 : Form
002 {
003 private Process myProcess;
004
005 public Form1()
006 {
007 InitializeComponent();
008
009 this.button1.Click += this.button1_Click;
010
011 this.button2.Click += this.button2_Click;
012 this.button2.Enabled = false;
013 }
014
015 private void button1_Click(object sender, EventArgs e)
016 {
017 // 開始ボタン:非活性 / 停止ボタン:活性
018 SwitchButtonEnable(false);
019
020 // 10秒間スリープするだけのバッチを指定
021 this.myProcess = new Process();
022 this.myProcess.StartInfo.FileName = @".\Sample.bat";
023
024 // バッチ処理の終了時に発生させるイベント処理を指定
025 // ※SynchronizingObjectプロパティに当画面のインスタンスを指定することで
026 // このイベント処理はGUIスレッドで動作する
027 this.myProcess.Exited += button2_Click;
028 this.myProcess.EnableRaisingEvents = true;
029 this.myProcess.SynchronizingObject = this;
030
031 // 開始
032 this.myProcess.Start();
033 }
034
035 private void button2_Click(object sender, EventArgs e)
036 {
037 // すでに当処理が実施済みなら何もしない
038 if (this.myProcess == null) { return; }
039
040 // バッチ処理の終了時に発生させるイベント処理を削除
041 this.myProcess.Exited -= button2_Click;
042 this.myProcess.EnableRaisingEvents = false;
043
044 if (!this.myProcess.HasExited)
045 {
046 try
047 {
048 this.myProcess.Kill();
049 }
050 catch
051 {
052 // 停止ボタン押下直後にプロセスが終了したケースを想定
053 // よって例外をキャッチしても何もしていない
054 }
055 }
056
057 // 怒涛のインスタンス開放
058 this.myProcess.Refresh();
059 this.myProcess.Close();
060 this.myProcess.Dispose();
061 using (this.myProcess) { }
062
063 // 閉じるボタン押下とプロセス終了イベントがほぼ同時に発生した時、
064 // 当関数の処理が2回実行されない様にnullを設定しておく
065 this.myProcess = null;
066
067 // 開始ボタン:活性 / 停止ボタン:非活性
068 SwitchButtonEnable(true);
069 }
070
071 private void SwitchButtonEnable(bool isEnable)
072 {
073 button1.Enabled = isEnable;
074
075 button2.Enabled = !isEnable;
076 }
077 }
以上を踏まえて、このアプリ、停止ボタンを押下しても
起動したbatが終了しません。
コード22行目で指定している「Sample.bat」は
timeout /T 10
というスリープ処理が1行あるだけの物となっています。
しかもコード22行目の起動対象ファイルを
・メモ帳 "C:\Windows\System32\notepad.exe"
・エクセルファイル ".\適当.xlsx"
などにした場合は期待通り終了します。
ここから質問ですが、
@batだけ終了しないのは何故か?
Abatを終了させる方法はあるか?
が分かる方、いらっしゃいましたらお力添えいただきたいです。
※特にAが知りたいです
長くなりましたが宜しくお願い致します。
マルチポストを報告
Javascriptを有効にしてください
この投稿がマルチポスト(全く同じ内容の投稿が別の掲示板に投稿されている)の場合は、以下のフォームをご利用いただくと、報告の投稿が簡単に行えます。
このフォームに必要事項を入力後、「返信フォームに入力する」ボタンをクリックすると、このページの下にある
返信フォーム
の項目が自動的に埋まります。実際に投稿するには、その後、返信フォームの「送信」ボタンをクリックしてください。
このフォームを利用しても返信フォームが埋まるだけですので、後で書き直してから投稿することもできます。
「マルチポストされている場所」には、マルチポストされている場所のURLを入力してください。複数のURLを改行区切りで入力することができます。
マルチポストされている場所
オプション
マルチポスト先の投稿が、別人によるいたずらである可能性が高い
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35574
/ ResNo.1)
Re[1]: Processクラスからbatファイル実行後、KILLできない
▲
▼
■
□投稿者/ Azulean
大御所(545回)-(2024/01/13(Sat) 14:01:27)
■
No35573
に返信(あばば無人君さんの記事)
> コード22行目で指定している「Sample.bat」は
> timeout /T 10
> というスリープ処理が1行あるだけの物となっています。
たとえば、バッチファイルを「pause」として入力待ちだけにすれば、このコードでも問題なく動作すると思います。
timeout の場合、cmd.exe とは別に timeout.exe プロセスが立ち上がります。
今回のコードでは cmd.exe は終了できますが、子プロセスである timeout.exe は生き残っていますので、止まりません。
ご自身で子プロセスの列挙と停止といった処理を作る必要があるそうです。
https://stackoverflow.com/a/32405627
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
■35575
/ ResNo.2)
Re[2]: Processクラスからbatファイル実行後、KILLできない
▲
▼
■
□投稿者/ あばば無人君
一般人(2回)-(2024/01/13(Sat) 17:01:14)
■
No35574
に返信(Azuleanさんの記事)
> ■
No35573
に返信(あばば無人君さんの記事)
> たとえば、バッチファイルを「pause」として入力待ちだけにすれば、このコードでも問題なく動作すると思います。
>
> timeout の場合、cmd.exe とは別に timeout.exe プロセスが立ち上がります。
> 今回のコードでは cmd.exe は終了できますが、子プロセスである timeout.exe は生き残っていますので、止まりません。
ご記載のとおり、pauseコマンドですと期待通り終了しましたし、
FTPコマンド(ftp.exe)だとtimeoutと同じく終了しませんでした。
なるほど、別プロセスですか。盲点でした。
> ご自身で子プロセスの列挙と停止といった処理を作る必要があるそうです。
> https://stackoverflow.com/a/32405627
参考リンク、ありがとうございます。時間ができたらサンプルを作ってみます。
今回は客先指定のアプリが手元に無かったのでbatのtimeoutで代用していましたが、
客先指定のアプリがKILLで終了するのは分かっているので
本件はこれで解決とさせていただきます。
ご回答ありがとうございました。
解決
済
み!
違反を報告
Javascriptを有効にしてください
この投稿が掲示板のルールに違反しており、何らかの対処が必要であると思われる場合は、以下のフォームを利用して管理人に報告することができます。
マルチポストの報告は、
返信フォーム
の上にある「マルチポストの報告」リンクをご利用ください。
この機能の悪用は絶対にしないでください。
悪用されたと管理人が判断した場合は、予告なしで厳しい対処がなされる可能性があります。
確認等の目的で、入力されたメールアドレス宛に返信メールが送信される可能性があります。メールの受信ができないメールアドレスは入力しないでください。
下のフォームが使用できない場合は、
メールフォーム
を使って管理人にご報告ください。
お名前(必須)
メールアドレス(必須)
本文(必須)
(違反理由など)
引用返信
削除キー/
編集
削除
このスレッドをツリーで一括表示
スレッド内ページ移動 / <<
0
>>
このスレッドに書きこむ
入力内容にタグは利用できません。
引用部分(行頭に「>」や「■」が付いている部分)が全体の 80% 以上のコメントは投稿できません。
半角カナは使用しないでください。文字化けの原因になります。
削除キーを覚えておくと、自分の記事の編集・削除ができます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
使用例)
No123 → 記事No123の記事リンクになります(指定表示)。
No123,130,134 → 記事No123/130/134 の記事リンクになります(複数表示)。
No123-130 → 記事No123〜130 の記事リンクになります(連続表示)。
投稿前に必ずお読みください
初めて投稿される方は、必ず「
書き込みのルールについて(12/4/2更新)
」をお読みください。
読むのが面倒、ルールを守りたくないという方は、「
お気楽掲示板
」へ投稿してください。
質問を投稿する場合は、「
質問をする際のアドバイス
」を参考にしてください。
投稿は、明記のない限り、パブリックドメインになります。
マルチポストされた投稿を報告する時は匿名で投稿し、マルチポストされている場所を併記してください。以下のリンクをクリックしていただくと、自動で下のフォームが埋まりますので、その後「送信」ボタンを押してご投稿ください。
マルチポストの報告をする
マルチポストの報告をするが、マルチポスト先の投稿が嫌がらせである(元の投稿者とは別人が行なっている)可能性が高い
(投稿日時に開きがあり、こちらの投稿の方が早い場合は、その可能性が高いです)
Name
/
E-Mail
/
Title
/
URL
/
Comment/ 通常モード->
図表モード->
(適当に改行して下さい/半角10000文字以内)
■No35575に返信(あばば無人君さんの記事) > ■No35574に返信(Azuleanさんの記事) > >>■No35573に返信(あばば無人君さんの記事) >>たとえば、バッチファイルを「pause」として入力待ちだけにすれば、このコードでも問題なく動作すると思います。 >> >>timeout の場合、cmd.exe とは別に timeout.exe プロセスが立ち上がります。 >>今回のコードでは cmd.exe は終了できますが、子プロセスである timeout.exe は生き残っていますので、止まりません。 > > ご記載のとおり、pauseコマンドですと期待通り終了しましたし、 > FTPコマンド(ftp.exe)だとtimeoutと同じく終了しませんでした。 > > なるほど、別プロセスですか。盲点でした。 > > >>ご自身で子プロセスの列挙と停止といった処理を作る必要があるそうです。 >>https://stackoverflow.com/a/32405627 > > 参考リンク、ありがとうございます。時間ができたらサンプルを作ってみます。 > > 今回は客先指定のアプリが手元に無かったのでbatのtimeoutで代用していましたが、 > 客先指定のアプリがKILLで終了するのは分かっているので > 本件はこれで解決とさせていただきます。 > > ご回答ありがとうございました。 >
File
/
アップ可能拡張子=> /
.gif
/
.jpg
/
.png
/.zip
1) 太字の拡張子は画像として認識されます。
2) 画像は初期状態で縮小サイズ250×250ピクセル以下で表示されます。
3) 同名ファイルがある、またはファイル名が不適切な場合、
ファイル名が自動変更されます。
4) アップ可能ファイルサイズは1回
20KB
(1KB=1024Bytes)までです。
5) ファイルアップ時はプレビューは利用できません。
6) スレッド内の合計ファイルサイズ:[0/300KB]
残り:[300KB]
Icon
/
ホイールロボ
くるりロボ
ぱんだ
ふとめネコ
ねずみ
こあら
疑問ねこ
ランダム
管理者用
(画像を選択/
サンプル一覧
)
削除キー
/
(半角8文字以内)
解決
済
み!
BOX/
解決したらチェックしてください!(スレッドを閉じる目的ではチェックしないでください!)
クリエイティブ・コモンズ・ライセンス
を Comment の末尾に挿入するには、以下のリンクをクリックしてください。(Javascript で挿入しているだけです。)
表示(CC BY)
|
表示-改変禁止(CC BY-ND)
|
表示-継承(CC BY-SA)
|
表示-非営利(CC BY-NC)
|
表示-非営利-改変禁止(CC BY-NC-ND)
|
表示-非営利-継承(CC BY-NC-SA)
プレビュー/
クッキーに保存しない/
Mode/
通常管理
表示許可
Pass/
HOME
HELP
新規作成
新着記事
ツリー表示
スレッド表示
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-