(PowerShell) 自作アプリケーション (exe) のプロセスを再起動する

経緯

起動中の自作アプリケーション (Wails / Go + React) の exeファイル を Powershell から再起動させたくなったのでその方法を調べました。

コード

resurreccion.ps1

# exeファイル指定
[String]$process_name="Homebrew-Some-Application.exe"

######################
# main process       #
######################
Get-WmiObject Win32_Process | Where-Object{$_.Name -match $process_name} | ForEach-Object{
    # exeファイルの所在へ移動 (作業フォルダの関係で、exeのあるフォルダまで移動しないと exe が上がってこない)
    Set-Location (Split-Path -Path $_.Path -Parent)
    # プロセスを止める
    Stop-Process $_.Handle
    # プロセスを軌道
    Start-Process $_.Path
    # パスを出力
    Write-Output($_.Path)
}

start.bat

cd /d %~dp0

PowerShell -ExecutionPolicy Bypass .\resurreccion.ps1

@pause

bat から PowerShell をキックするいつものパターンで。

注意点としては参考にした記事の通り

注意点は、引数に渡されたプロセス名を -match で部分一致させている点です。他のプロセス名の一部分に含まれる文字列を指定すると、予期せぬプロセスを停止してしまうことがありえます。

PowerShell: プロセスを再起動するスクリプト – あれやこれや

名前が他のプロセス名と合致してしまうとそちらも巻き添えで落としてしまう、という可能性があること。そのため、一般的に使われている名前の exe に対しては使うのを控えた方が良さそうです。

また、今回の自分のケースでは元のコードから

Set-Location (Split-Path -Path $_.Path -Parent)

を追加している点です。

これは上述サンプルコード内のコメントに記載した通りですが、作業フォルダの関係で、この PowwrShell のプロセスが exe のあるフォルダまで移動しないと exe を起動できないため、該当 exe が存在するパスまでわざわざ移動しています。

これで今回意図した挙動を得ることはできました。

参考

プロセスの再起動

exe が起動しない

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。