引っ越し・セグメント移動でプリンターのIPが変わったときにサクッと置き換えるメモ
対象OS: Windows 10/11
対象: ローカルに作成した「標準TCP/IPポート(RAW 9100)」のプリンター
想定ケース: 旧IP(例: 192.0.2.10)→ 新IP(例: 198.51.100.20)に切替
⚠️重要:この記事の操作は環境により影響が大きいです。すべて自己責任で実施してください。必ず事前にバックアップ/スナップショット等をご準備ください。
結論(よくある勘違い)
-
Set-Printer -PortName ...は “参照するポート名” を付け替えるだけ。
既存ポートの**中身(HostAddress)**は変わりません。 - 既存ポートの HostAddress を変える“正攻法”は
prnport.vbs -u。 - 付け替えが渋い時は
prncnfg.vbsで強制切替が最短。
1. 変数(ダミーIPに置換して使ってください)
本記事では以下の例示IPを使います(実運用では自社のIPに置換してください)。
- 旧IP:
192.0.2.10(例示用) - 新IP:
198.51.100.20(例示用) - ポート名は Windows の慣例で
IP_198.51.100.20のようにしています。
2. 最短ワンライナー(PowerShell/管理者)
まずは 既存ポートの中身だけ更新して済むパターン:
$oldPort = "IP_192.0.2.10" # 旧IPを向いている既存ポート名
$newIp = "198.51.100.20" # 新IP
$adm = "$env:WINDIR\System32\Printing_Admin_Scripts"
$dir = if (Test-Path "$adm\ja-JP\prnport.vbs") { "$adm\ja-JP" } elseif (Test-Path "$adm\en-US\prnport.vbs") { "$adm\en-US" } else { $adm }
cscript //nologo "$dir\prnport.vbs" -u -r $oldPort -h $newIp
Restart-Service Spooler
Get-CimInstance Win32_TCPIPPrinterPort | Select Name,HostAddress | Sort Name
これで ポート名はそのまま、接続先IPだけ新IPに変わります。
そのポートを使っているプリンターは自動で新IPへ。
3. 新しいポート名に“付け替える”方式(PowerShell/管理者)
見た目も揃えたい(IP_198.51.100.20にしたい)場合:
$printerName = "プリンター名" # 対象プリンター名
$newIp = "198.51.100.20"
$newPort = "IP_$newIp"
# prnport/prncnfg のパス解決
$adm = "$env:WINDIR\System32\Printing_Admin_Scripts"
$dir = if (Test-Path "$adm\ja-JP\prnport.vbs") { "$adm\ja-JP" } elseif (Test-Path "$adm\en-US\prnport.vbs") { "$adm\en-US" } else { $adm }
$prncnfg = "$dir\prncnfg.vbs"
# 1) 新ポートを用意(なければ作る)&中身を正す
if (-not (Get-PrinterPort -Name $newPort -ErrorAction SilentlyContinue)) {
cscript //nologo "$dir\prnport.vbs" -a -r $newPort -h $newIp -o raw -n 9100
}
cscript //nologo "$dir\prnport.vbs" -u -r $newPort -h $newIp
# 2) 付け替え(Set-Printerで渋い時はVBScriptが確実)
try { Set-Printer -Name $printerName -PortName $newPort -ErrorAction Stop }
catch { cscript //nologo $prncnfg -t -p $printerName -r $newPort }
# 3) リフレッシュ&確認
Restart-Service Spooler
Get-Printer -Name $printerName | Select Name,PortName
Get-CimInstance Win32_TCPIPPrinterPort | Where-Object Name -eq $newPort | Select Name,HostAddress
4. BAT版(管理者で実行)
@echo off
setlocal
set "PN=[本社]複合機"
set "NEWIP=198.51.100.20"
set "NEWPORT=IP_%NEWIP%"
set "ADM=%WINDIR%\System32\Printing_Admin_Scripts"
if exist "%ADM%\ja-JP\prnport.vbs" set "SCR=%ADM%\ja-JP"
if not defined SCR if exist "%ADM%\en-US\prnport.vbs" set "SCR=%ADM%\en-US"
if not defined SCR set "SCR=%ADM%"
echo [1] ポート作成/更新: %NEWPORT% -> %NEWIP%
cscript //nologo "%SCR%\prnport.vbs" -a -r %NEWPORT% -h %NEWIP% -o raw -n 9100 >nul 2>&1
cscript //nologo "%SCR%\prnport.vbs" -u -r %NEWPORT% -h %NEWIP%
echo [2] プリンター強制付け替え: "%PN%" -> %NEWPORT%
for %%A in ("%SCR%\prncnfg.vbs") do cscript //nologo "%%~A" -t -p "%PN%" -r %NEWPORT%
echo [3] Spooler 再起動
net stop spooler >nul & net start spooler >nul
echo [4] 確認
wmic printer get Name,PortName
cscript //nologo "%SCR%\prnport.vbs" -g -r %NEWPORT%
pause
5. 複数台を一括で付け替える(旧IP→新IPのマッチング)
旧IPを向くポートを使っているプリンターすべてを新ポートに付け替える例:
$oldIp = "192.0.2.10"
$newIp = "198.51.100.20"
$oldPort = "IP_$oldIp"
$newPort = "IP_$newIp"
$adm = "$env:WINDIR\System32\Printing_Admin_Scripts"
$dir = if (Test-Path "$adm\ja-JP\prnport.vbs") { "$adm\ja-JP" } elseif (Test-Path "$adm\en-US\prnport.vbs") { "$adm\en-US" } else { $adm }
$prncnfg = "$dir\prncnfg.vbs"
# 新ポートを用意&正す
if (-not (Get-PrinterPort -Name $newPort -ErrorAction SilentlyContinue)) {
cscript //nologo "$dir\prnport.vbs" -a -r $newPort -h $newIp -o raw -n 9100
}
cscript //nologo "$dir\prnport.vbs" -u -r $newPort -h $newIp
# 旧ポートを使うプリンターを全部切替
$targets = Get-Printer | Where-Object { $_.PortName -eq $oldPort }
foreach ($p in $targets) {
try { Set-Printer -Name $p.Name -PortName $newPort -ErrorAction Stop }
catch { cscript //nologo $prncnfg -t -p $p.Name -r $newPort }
}
Restart-Service Spooler
Get-Printer | Select Name,PortName | Format-Table -AutoSize
6. よくあるハマりどころ(対策付き)
-
WMIで
HostAddressは読み取り専用
→Set-CimInstanceでは書き換え不可。prnport.vbs -uを使う。 -
Set-Printerが成功表示でも反映されない
→ ドライバやスプーラー状態依存。prncnfg.vbs -t -p -rで強制 & Spooler再起動。 -
ポート名だけ変えて中身が旧IPのまま
→prnport.vbs -g -r <ポート名>で確認、-u -h 新IPで修正。 -
32bit/64bit差異でVBScriptが見つからない
→C:\Windows\Sysnative\cscript.exeを明示指定して呼ぶと安定。 -
WSDポート(WSD-xxxxx)は対象外
→ 標準TCP/IPポート(IP_x.x.x.x)のみ想定。 -
共有プリンター(Type=Connection)はクライアント側でポート変更不可
→ サーバ側でキューのポートを変更、またはクライアントにローカル作成して移行。
7. 事前/事後チェック・コマンド
# すべてのプリンターとポート
Get-Printer | Select Name,PortName | Sort Name | Format-Table -AutoSize
# TCP/IPポートのIP一覧
Get-CimInstance Win32_TCPIPPrinterPort | Select Name,HostAddress | Sort Name
# 個別ポートの詳細(VBScript)
$adm = "$env:WINDIR\System32\Printing_Admin_Scripts"
$dir = if (Test-Path "$adm\ja-JP\prnport.vbs") { "$adm\ja-JP" } elseif (Test-Path "$adm\en-US\prnport.vbs") { "$adm\en-US" } else { $adm }
cscript //nologo "$dir\prnport.vbs" -g -r IP_198.51.100.20
8. まとめ
- 「ポート名の付け替え」 と 「ポートの中身(HostAddress)の更新」 は別物。
- まずは
prnport.vbs -uで中身更新、見た目も揃えたいときは 新ポート作成→付け替え。 - 渋い時は
prncnfg.vbsと Spooler再起動でだいたい解決。
付記
- 記事内のIPは 例示用アドレス(
192.0.2.0/24,198.51.100.0/24など)に置き換えています。実運用では自社のIPに替えてください。