経緯
起動中の自作アプリケーション (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 で部分一致させている点です。他のプロセス名の一部分に含まれる文字列を指定すると、予期せぬプロセスを停止してしまうことがありえます。
名前が他のプロセス名と合致してしまうとそちらも巻き添えで落としてしまう、という可能性があること。そのため、一般的に使われている名前の exe に対しては使うのを控えた方が良さそうです。
また、今回の自分のケースでは元のコードから
Set-Location (Split-Path -Path $_.Path -Parent)
を追加している点です。
これは上述サンプルコード内のコメントに記載した通りですが、作業フォルダの関係で、この PowwrShell のプロセスが exe のあるフォルダまで移動しないと exe を起動できないため、該当 exe が存在するパスまでわざわざ移動しています。
これで今回意図した挙動を得ることはできました。