Powershell でWindowsのサービスを強制的に再起動する

ときどきWi-Fiが使えなくなるときがあり(電波アイコンに赤いバツがつく),wlansvc サービスを再起動しようにもSTOP_PENDING状態で固まることがあった. なのでwlansvcを強制的に再起動するためのPowershellスクリプトを書いてみた.

あくまで応急処置であり,根本的解決策ではない.wlansvcが突然固まる原因は一体…(´・ω・`)

再起動したいサービス名を調べる

Get-Service を引数なしで実行することでサービス一覧が表示される.後のコマンドではNameカラムに表示されるサービス名を使用する.

PS C:\WINDOWS\system32> Get-Service

Status   Name               DisplayName
------   ----               -----------
Running  AdobeARMservice    Adobe Acrobat Update Service
Running  AESMService        Intel® SGX AESM
Running  AGSService         Adobe Genuine Software Integrity Se...
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
Running  Appinfo            Application Information
Running  Apple Mobile De... Apple Mobile Device Service
Stopped  AppMgmt            Application Management
Stopped  AppReadiness       App Readiness
Stopped  AppVClient         Microsoft App-V Client
Running  AppXSvc            AppX Deployment Service (AppXSVC)
Stopped  AssignedAccessM... AssignedAccessManager サービス
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
// snip //

PIDを調べる

Get-WmiObject コマンドを使ってWMIから調べる.Filter引数はSQLのWhere句のように書ける. %ワイルドカード

PS C:\WINDOWS\system32> Get-WmiObject -Class Win32_Service -Filter "Name LIKE 'wlan%'"


ExitCode  : 0
Name      : WlanSvc
ProcessId : 13564
StartMode : Auto
State     : Running
Status    : OK

PIDを抽出する

上記のようにサービスの詳細が出力できたら,あとは文字列加工をするのみ. Linuxでいうgrepコマンドにあたる findstr コマンドでProcessId 行のみを取り出し,cutコマンドの代わりに ForEach-Object コマンド(省略形: %)と split演算子を組み合わせてPIDを抽出する.

PS C:\WINDOWS\system32> Get-WmiObject -class win32_service -filter "name='wlansvc'" | findstr ProcessId | % {$($_.split(":"))[1]}
 13564

サービスを強制停止&起動

taskkill.exe /F /PID $WLANSVC_PID
Start-Service -Name wlansvc

スクリプト

gist.github.com

参考