目的
PLCを始めとした、ネットワークに接続されていない機器にノートPCなどから接続するときは、
コントロールパネルからIPアドレスを変更する必要がある。
製造業などでは一日に何度も接続する必要があり、IPアドレスを毎回切り替えるのは面倒だから、
Powershellを使って自動化しようと考えた。
インターネットを検索しても、特定のコマンドの説明だけでそれをどうまとめ上げるべきかの説明がなかったので、
自分でまとめてみた。
参考:https://qiita.com/hanakara_milk/items/1197ac9b91fa1fa3abab
スクリプト
注意点
- Read-Hostコマンドの部分は初回実行時以外は固定値をもたせましょう。
- インターネットから切り離されている設備への接続が目的。
- IPv4で接続する。
- サブネットマスクは255.255.255.0固定、デフォルトゲートウェイも不要。
固定IPへ変更するときのスクリプト
Write-Host 現在の設定は下記のとおりになっています。
Get-NetIPAddress | Select-Object -Property IPAddress, InterfaceIndex, InterfaceAlias
$changeIndex = Read-Host 何番のInterfaceIndexを固定IPに変更しますか?
$newIPAddress = Read-Host 新しいIPアドレスを指定してください。
$targetIpaddress = Get-NetIPAddress | Where-Object InterfaceIndex -eq $changeIndex | Select-Object -First 1
# 存在していないInterfaceIndexを選択していたら下記は通らない
foreach($nonNullAdress in $targetIpaddress){
Remove-NetIPAddress -InterfaceIndex $changeIndex -AddressFamily IPv4
$resultName = New-NetIPAddress $newIPAddress -InterfaceIndex $changeIndex -PrefixLength 24 -AddressFamily IPv4 | Select-Object -First 1
Restart-NetAdapter $resultName.InterfaceAlias
}
DHCPへ戻すときのスクリプト
Write-Host 現在の設定は下記のとおりになっています。
Get-NetIPAddress | Select-Object IPAddress, InterfaceIndex, InterfaceAlias
Get-NetIPInterface | Select-Object InterfaceIndex, InterfaceAlias, AddressFamily, Dhcp
$changeIndex = Read-Host 何番のInterfaceIndexをDHCPへ戻しますか?
$target = Get-NetIPAddress | Where-Object InterfaceIndex -eq $changeIndex | Select-Object -First 1
# 取得失敗対策
foreach($nonNullTarget in $target){
Remove-NetIPAddress -InterfaceIndex $changeIndex -AddressFamily IPv4
Set-NetIPInterface -InterfaceIndex $changeIndex -Dhcp Enabled -AddressFamily IPv4
$adapterName = $nonNullTarget.InterfaceAlias
Restart-NetAdapter $adapterName
Write-Host "$adapterNameのDHCPを設定しました"
}
ポイント
- 最初にIPアドレスを変更する対象を変数に入れ、使い回す。
- 入力された値を使って変更対象のイーサネットアダプタ名等を取得し、入力ミスを減らす。
- foreach文を使って対象のイーサネットアダプターを取得できなかったときの対応をする。
- もし対象が見つかったらforeach文の中を実行するようにしている。
nullチェックはif文でも大丈夫だが、個人的に条件式の作り方が気に入らなくて逃げているだけ。
毎回数値を手入力するような場合はif文にして、見つからなかったときの処理を作るほうがよさそうだ。