Home >
Windows にまつわる e.t.c.
取り外した NIC をデバイスリストからコマンドラインで削除する
取り外してデバイマネージャーで非表示になっているデバイスは、通常放置で構わないのですが、NIC
に名前を付けている場合は同じ名前が付けられないのでなかなか厄介です。
こんな時は、取り外したデバイスを表示して削除します。
取り外したデバイスを削除する
http://www.vwnet.jp/windows/WS08R2/Device/Deleted.htm
GUI でポチポチするのであればこれで十分なのですが、対象が複数台ある場合は GUI
ポチポチはやってられないので、バッチで何とかしたいですね。
こんな時は WDK に含まれている devcon.exe を使ってコマンドラインで削除することができます。
WDK のインストール
WDK は以下からダウンロードしてインストールします。
Download the Windows Driver Kit (WDK) | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk?WT.mc_id=WD-MVP-36880
これを書いている時点のダウンロード リンク(w7/WS08R2 でも問題なく動きました)
インストールが完了すると、以下に devcon.exe がセットされるので Path を通すか、フルパスを指定して
devcon.exe を使います。
C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe |
(x86環境要で操作する場合は x86 フォルダの方を使います)
NIC のリストアップ
現在の NIC をリスティングする場合は、「listclass net」オプションを使います。
取り外された NIC を含め、すべての NIC をリスティングする場合は、「findall =net」オプションを使います。
取り外された NIC の削除
これらでリスティングされた NIC を ID で突き合わせ、取り外された NIC を特定します。
取り外された NIC は「-r remove "@ID"」オプションで削除します。
devcon.exe -r remove "@ID" |
PowerShell で自動化する
コマンドラインが分かったので、PowerShell で自動化するとこんな感じになります。
[ RemoveDeletedNIC.ps1 ]
##################################################################
# 取り外した NIC をデバイスリストから削除する
##################################################################
# devcon.exe のプルパス
$DevCon = "C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe"
##################################################################
# 現在の NIC 取得
##################################################################
function GetNowNICs(){
# 現在の NIC リスト
[array]$NowNICs = . "$DevCon" listclass net
# 現在の NIC リストを格納するオブジェクト
$NowNICObjects = @()
# オブジェクトにする
$Max = $NowNICs.Count
for( $Index = 0;$Index -lt $Max; $Index++){
$NowNICObject = New-Object PSObject | Select-Object DeviceID, DeviceName
# 先頭行にある余分な文字列を削除
if( $Index -eq 0 ){
$NowNICs[$Index] = $NowNICs[$Index] -replace "^Listing [0-9]+ .+\("
}
[array]$Buffer = $NowNICs[$Index] -Split ":"
if($Buffer.Count -eq 2){
$NowNICObject.DeviceID = $Buffer[0].Trim()
$NowNICObject.DeviceName = $Buffer[1].Trim()
}
$NowNICObjects += $NowNICObject
}
return $NowNICObjects
}
##################################################################
# 未接続も含めた全 NIC 取得
##################################################################
function GetAllNICs(){
# 未接続も含めた全 NIC リスト
[array]$AllNICs = . "$DevCon" findall =net
# 未接続も含めた全 NIC リストを格納するオブジェクト
$AllNICObjects = @()
# オブジェクトにする
$Max = $AllNICs.Count -1
for( $Index = 0;$Index -lt $Max; $Index++){
$AllNICObject = New-Object PSObject | Select-Object DeviceID, DeviceName
[array]$Buffer = $AllNICs[$Index] -Split ":"
if($Buffer.Count -eq 2){
$AllNICObject.DeviceID = $Buffer[0].Trim()
$AllNICObject.DeviceName = $Buffer[1].Trim()
}
$AllNICObjects += $AllNICObject
}
return $AllNICObjects
}
##################################################################
# 未接続 NIC をデバイスから削除する
##################################################################
function RemoveNotConnectNIC( $NowNICObjects, $AllNICObjects){
# 未接続 NIC をデバイスから削除する
$Max = $AllNICObjects.Count
for( $Index = 0;$Index -lt $Max; $Index++){
# 未接続になっている NIC
if(-not $NowNICObjects.DeviceID.Contains($AllNICObjects[$Index].DeviceID)){
# RAS 以外の未接続 NIC を消す
if( $AllNICObjects[$Index].DeviceName -ne "RAS"){
$RemoveNICID = $AllNICObjects[$Index].DeviceID
$RemoveNICName = $AllNICObjects[$Index].DeviceName
echo "Removed NIC / $RemoveNICID : $RemoveNICName"
# devcon.exe で削除
$RemoveTerget = "`"@" + $RemoveNICID + "`""
. $DevCon -r remove $RemoveTerget
}
}
}
}
##################################################################
# main
##################################################################
# 現在有効な NIC 取得
[array]$NowNICs = GetNowNICs
# 取り外した分も含めたすべての NIC
[array]$AllNICs = GetAllNICs
# 取り外された NIC 削除
RemoveNotConnectNIC $NowNICs $AllNICs
|
公開リポジトリ
最新版は以下リポジトリに公開しているので、Sourcetree 等の Git Clientで Clone
して使ってください。
git@github.com:MuraAtVwnet/DeleteRemovedNIC.git
https://github.com/MuraAtVwnet/DeleteRemovedNIC
参考情報
取り外したデバイスを削除する
http://www.vwnet.jp/windows/WS08R2/Device/Deleted.htm
Windows Device Console (Devcon.exe) | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/devtest/devcon?WT.mc_id=WD-MVP-36880
デバイスの有効・無効をプログラムから切り替える方法
https://docs.microsoft.com/ja-jp/archive/blogs/jpwdkblog/663?WT.mc_id=WD-MVP-36880
DevCon と SetupDi API ~ DevCon の使い方編 ~
https://docs.microsoft.com/ja-jp/archive/blogs/jpwdkblog/devcon-setupdi-api-devcon?WT.mc_id=WD-MVP-36880
Copyright © MURA
All rights reserved.