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