Windows10でデバイスの有効・無効化をPowerShellのスクリプトにより自動処理する方法を紹介します。さらに、ログオン時に自動実行することも取り上げます。
1. デバイスの有効・無効化について
Windowsではデバイスの管理はデバイスマネージャーからおこないます。
たまに触るのならいいのですが、度々いじりたいときには面倒になり、スクリプトで自動処理したくなります。
幸い、Windows10のPowerShell にはデバイスの有効・無効化するコマンドがあります。
2. デバイスの確認
制御したいデバイスの名前(識別子)を確認します。
ここでは FeliCa デバイスを対象としてみます
2.1 デバイスマネージャーを起動
スタートボタンで右クリックしてメニューから「デバイスマネージャー」をクリックします
2.2 デバイス名の確認
目的のデバイスを探し名前をメモっておいてください。
下記の画面では 'FeliCa Port/PaSoRi RCS956 USB' です。デバイス名とします。
その後、名前の部分をダブルクリックします。
2.3 「詳細」タブをクリック
2.4 プロパティの「デバイスの説明」の個所をクリック
2.5 デバイス インスタンス パスをクリック
2.6 名前を確認する
デバイス インスタンス パスとしてメモしておきます。
今回の場合は 'USB\VID_054C&PID_02E1\6&1041377&0&2'です。
3. PowerShell でデバイス取得
PowerShellで目的のデバイスを見つけます。ここでは例題として USB接続のFeliCa デバイスを取り上げます。
3.1 PowerShellを起動します
スタートボタンで右クリックしてメニューから「Windows PowerShell(管理者)」をクリックします。
3.2 デバイス名による指定
PowerShellを使って制御したいデバイスを探します。
Get-PnpDevice
これですべてのデバイスの一覧を取得できます。ここから制御したいデバイスを絞り込みます。
まずデバイス名で探してみます。一部のキーワードだけでもいいので、今回は'FeliCa'をキーワードにしてみます。
FeliCa の前後に文字があっても引っかかるように、アスタリスク '*' をつけます。
Get-PnpDevice | ? {$_.friendlyname -like '*FeliCa*'}
実行結果は以下の通り1つ見つかりました。
Status Class FriendlyName InstanceId ------ ----- ------------ ---------- OK FeliCa FeliCa Port/PaSoRi RCS956 USB USB\VID_054C...
ここで1つに絞り込めればこの章は終わりです。次章へ進めます
絞り込めなければ、そのまま↓をどうぞ。
3.3 デバイス インスタ パスによる指定
デバイス インスタンス パスを指定して絞り込みます。こちらの方法であれば確実に1つのデバイスを指定できます。
Get-PnpDevice | ? {$_.InstanceId -eq 'USB\VID_054C&PID_02E1\6&1041377&0&2'}
4. スクリプトを作成
デバイスの絞り込みができたので、スクリプトにします。 メモ帳などのエディタを使用して DeviceStop.ps1 として以下を作成します。
デバイス名を使う場合
Get-PnpDevice | ? {$_.friendlyname -like "*FeliCa*"} | Disable-PnpDevice -Confirm:$false
デバイス インスタ パスを使う場合
Get-PnpDevice | ? {$_.InstanceId -eq 'USB\VID_054C&PID_02E1\6&1041377&0&2'} | Disable-PnpDevice -Confirm:$false
さらに、このスクリプトを呼び出すバッチファイルを作ります。 DeviceStop.bat
PowerShell -ExecutionPolicy RemoteSigned .\DeviceStop.ps1 pause
5. テスト
4で作成したバッチファイルを実行してみます。
Disable-PnpDevice : エラーです + ... $_.friendlyname -like "*FeliCa*"} | Disable-PnpDevice -Confirm:$false (Win32_PnPEntity...6&1041377&0&2"):ROOT\cimv2\Win32_PnPEntity) [Disable-PnpDevice], CimException + FullyQualifiedErrorId : HRESULT 0x80041001,Disable-PnpDevice
エラーになってしまいました。
これは管理者権限がないために発生するエラーです。
バッチファイルを起動する時に右クリックしてメニューから「管理者として実行」を選択してみます。
.\DeviceStop.ps1 : 用語 '.\DeviceStop.ps1' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 行:1 文字:1 + .\DeviceStop.ps1 + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (.\DeviceStop.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
今度はps1ファイルが見えなくなりました。管理者として実行するとカレントディレクトリが system32 に移動してしまうのが原因です。
batとps1は同じディレクトリに置いているので、batファイルのパスを取得してps1のパスを指定する方法を使います。
(仕組みはこちらを参照)
pmp-style.hatenablog.com
DeviceStop.bat
PowerShell -ExecutionPolicy RemoteSigned %~dp0\DeviceStop.ps1 pause
batファイルを書き換えてから、管理者として実行してみます。
C:\WINDOWS\system32>pause 続行するには何かキーを押してください . . .
成功しました。デバイスマネージャーで無効になっている事を確認しましょう。デバイスのアイコンに↓矢印が付いています
これで、バッチファイルからデバイスを停止する事が出来ました。
6. ログイン時に自動実行
デバイスによっては起動時は調子悪く、一度無効化した後に有効化しないとうまく動かないケースもあります。
そのような場合に、ログイン時にデバイスの無効化・有効化を自動実行することもあります。
タスクスケジューラを使ってPowerShellスクリプトをコールすことで実現できます。
6.1 PowerShellスクリプト
無効化した2秒後に再び有効にするスクリプトにします。
1行目は使用デバイスに応じて書き換えてください。
$x = Get-PnpDevice | ? {$_.friendlyname -like '*FeliCa*'} $x | Disable-PnpDevice -Confirm:$false Start-Sleep -s 2 $x | Enable-PnpDevice -Confirm:$false
6.2 タスクスケジューラ
PowerShellは実行時に必ずウインドウが開いてしまいます。起動時に毎回開くのはエレガントではないので非表示で実行します。
それをタスクスケジューラからコールします。
そのための方法は以下をご覧ください。