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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

Q&A

解決済

3回答

473閲覧

Batchファイルでpowershellの指定ファイルのみ強制終了したい。

Guttie

総合スコア6

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

0グッド

0クリップ

投稿2024/03/30 06:48

編集2024/03/30 06:59

実現したいこと

-PC上で一定数のpowershellスクリプトが定周期で動いています。
-ここでは3つ動いているとして、roop.sp1とmain.ps1とerror.ps2があり、roopとmainが定周期で動いています。
-このうち、mainとerrorにスクリプト開始の命令をするのはtrigger.batとします。
-main.ps1に実行を命令しますが30秒待ってもmain.ps1がrunningの場合は強制終了を行い、エラー発報のためのerror.ps1にスクリプト開始を命令します。
-この強制終了の際、roop.ps1は別途定周期で正常に動いているため、exe全体をkillするのは禁止としてファイル指定を行い落としたいです。

発生している問題・分からないこと

https://qiita.com/bill_g/questions/528b2583dce487ef1f63
上記、@bill_g (ka g)様の投稿を基にpowershellに当てはめて行いましたが、mainが強制終了できませんでした。

以降の該当ソースコードで、exe全体へは有効であることを確認しています。
(プロセスID指定でも強制終了できませんでした。)
ファイル指定での強制終了のロジックについてご教示いただけないでしょうか。

該当のソースコード

bat

1@echo off 2setlocal 3 4REM スクリプトのパスを指定 5set "mainScript=C:\Users\*****\Desktop\main.ps1" 6 7REM 制限時間(秒)を設定 8set "timeoutSeconds=30" 9 10REM PowerShellスクリプトを非同期で実行 11start "" powershell -NoProfile -ExecutionPolicy Bypass -File "%mainScript%" 12 13REM 制限時間を待機 14timeout /t %timeoutSeconds% /nobreak 15 16echo %processId% 17 18REM PowerShell強制終了 19::taskkill /f /im powershell.exe 20 21REM 指定PowerShellプロセスを強制終了 22taskkill /f /im powershell.exe /fi "WINDOWTITLE eq main.ps1*" 23 24echo mainスクリプトがrunningのため強制終了しました。 25echo エラー発報します。 26 27REM エラー発報スクリプトのパスを指定 28set "alartScript=C:\Users\*****\Desktop\error.ps1" 29 30REM PowerShellスクリプトを非同期で実行 31start "" powershell -NoProfile -ExecutionPolicy Bypass -File "%alartScript%" 32 33pause

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

-Googleで調べましたが、上記参考のようにテキストファイルに対しての説明のみでした。
-それらを基にpowershellに書き換えましたがいずれも動作せずでした。

補足

powershellのスクリプトに記述ミスはないものとします。
main.ps1は検証のためにStart-Sleepで強制的にrunningにさせているとします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

バッチ内のPowerShellの命令文にerror.ps1を追加します。

■main.ps1を終了するサンプルプログラム( CMD )

CMD

1powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^ 2"$main_ps1_PID = @(Get-CimInstance -ClassName Win32_Process -Property * ^| Where-Object ^{$_.CommandLine -match 'main.ps1'^} ^| ForEach-Object ^{$_.ProcessId^}) ^ 3;if ( $main_ps1_PID.count -ge 1 )^{ ^ 4cmd /c "start "" powershell -NoProfile -ExecutionPolicy Bypass -File C:\Users\*****\Desktop\error.ps1" ^ 5;Stop-Process $main_ps1_PID -Force ^ 6}" 7 89 10バッチの22行目から書きます。 11 12■注意事項■ 13C:\Users\*****\Desktop\error.ps1 ← *印はご自身の環境に変更してください

投稿2024/03/31 04:04

ccc-

総合スコア342

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

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

Guttie

2024/03/31 04:37

認識が合っていて良かったです。 また、わざわざ記述例までありがとうございます。 考えが一致していたので、思い通りの挙動にすることができました。 貴重なお時間を割いていただいたこと、改めてお礼申し上げます。
guest

0

バッチ内にPowerShellの命令文を書く方法もあります。

■main.ps1を終了するサンプルプログラム( CMD )

CMD

1powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^ 2"$main_ps1_PID = @(Get-CimInstance -ClassName Win32_Process -Property * ^| Where-Object ^{$_.CommandLine -match 'main.ps1'^} ^| ForEach-Object ^{$_.ProcessId^}) ^ 3;if ( $main_ps1_PID.count -ge 1 )^{ Stop-Process $main_ps1_PID -Force ^}" 4 56 7バッチの22行目から書きます。

投稿2024/03/31 01:29

ccc-

総合スコア342

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

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

Guttie

2024/03/31 02:54

ccc-様 続けてのご回答ありがとうございます! やはりPIDをうまく使えばファイル指定での強制終了が可能になるのですね、感動しました。 私がPIDを使用しようとしたときは別の番号を引っ張ってきて失敗していたので、思い通りでうれしいです。 ただこの場合、強制終了プロセスは確かに動いていますが、強制終了したときのみerror.ps1を実行させたいとならず、もちろん全ての場合でerror.ps1を蹴ってしまいますよね。 前途のようにしたい場合は、あくまでもバッチ内にPowerShellの命令文を書いているので、 ;if ( $main_ps1_PID.count -ge 1 )^{ Stop-Process $main_ps1_PID -Force ^}"のなかに 27~31行目に該当する記述を書いていけば良いという判断で合っていますでしょうか?
ccc-

2024/03/31 04:06

その方向で宜しいかと思います。 もう1つerror.ps1を追加したものをアップしました。
guest

0

バッチから、このPowerShellを実行する方法でもよろしいでしょうか?

■main.ps1を終了するサンプルプログラム( PowerShell )

PowerShell

1$main_ps1_PID = @(Get-CimInstance -ClassName Win32_Process -Property * | Where-Object {$_.CommandLine -match "main.ps1"} | ForEach-Object {$_.ProcessId}) 2if ( $main_ps1_PID.count -ge 1 ){ Stop-Process $main_ps1_PID -Force }

バッチの22行目を以下に変更

start "" powershell -NoProfile -ExecutionPolicy Bypass -File "本サンプルプログラムのパス"

投稿2024/03/30 11:01

ccc-

総合スコア342

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

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

Guttie

2024/03/31 00:25

早速のご回答ありがとうございます! 別立てのPowershellを新規で作って、そこでmainを指定して落とすということですね。 ちなみに、バッチではexe単位でしかkillは行えず、ファイル指定はそもそもが"不可能"という結論でしょうか?
ccc-

2024/03/31 01:30

バッチ内にPowerShellの命令文を書く方法もあります。 もう一つアップしておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問