0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

共有じゃないローカルプリンターのTCP/IPポートをIP変更する手順(PowerShell/BAT)

Last updated at Posted at 2025-10-07

引っ越し・セグメント移動でプリンターの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.vbsSpooler再起動でだいたい解決。

付記

  • 記事内のIPは 例示用アドレス192.0.2.0/24, 198.51.100.0/24 など)に置き換えています。実運用では自社のIPに替えてください。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?