ネットワークプリンタを手作業で追加して回るのは非効率です。バッチファイルに手順をまとめれば、共有プリンタの追加、既存の存在確認、既定プリンタの設定、古い接続の削除までを一括で自動化できます。Windows 10/11 では PowerShell 経由が堅実ですが、互換性重視なら printui.dll(PrintUIEntry)を使う方法も有効です。ここでは両アプローチをバッチから呼び出すテンプレートと、実運用の勘所を解説します。
前提と方針
管理者権限は必須ではありませんが、ドライバーの自動配布や全ユーザー適用を行う場合は昇格が必要になる場面があります。プリントサーバーの共有名(例 \\PRINTSRV\BizPrinter)を確定させ、接続前に疎通が取れることを確認し、失敗時のログを残す設計にしておくとトラブルシュートが容易です。バッチは「既に追加済みかを確認→未接続なら追加→必要に応じて既定化→不要な古い接続を削除」という流れにします。
PowerShellで確実に追加(推奨。Add-Printer をバッチから呼び出す)
PowerShellの印刷コマンドレットは成功可否の判定が容易で堅牢です。バッチはランチャーとして PowerShell を呼び出し、存在確認、追加、既定設定、削除を一気通貫で処理します。
@echo off
setlocal
set "PRN=\\PRINTSRV\BizPrinter"
set "SET_DEFAULT=1"
set "PS=powershell -NoProfile -ExecutionPolicy Bypass"
rem 疎通確認(3回まで)
ping -n 1 PRINTSRV >nul || ping -n 1 PRINTSRV >nul || ping -n 1 PRINTSRV >nul
rem 既存確認→未接続なら追加→必要なら既定化
%PS% ^
"$name = '%PRN%';" ^
"if (Get-Printer -Full | Where-Object { $_.Name -eq $name -or $_.ShareName -eq $name.TrimStart('\\') }) {" ^
" Write-Host 'Already connected:' $name" ^
"} else {" ^
" Write-Host 'Adding:' $name;" ^
" Add-Printer -ConnectionName $name;" ^
"}" ^
"; if ('%SET_DEFAULT%' -eq '1') { Try { Set-DefaultPrinter -Name $name } Catch { Write-Warning $_ } }"
if errorlevel 1 (
echo 失敗しました。権限、共有名、ドライバー配布設定を確認してください。
) else (
echo 完了しました。
)
endlocal
ドメイン資格情報が必要な環境では事前に資格情報キャッシュを設定してから実行すると安定します。
cmdkey /add:PRINTSRV /user:DOMAIN\printerop /pass:P@ssw0rd
互換重視:PrintUIEntryで追加(rundll32 printui.dll,PrintUIEntry)
古い環境やグループポリシーにより PowerShell が制限される場合は PrintUIEntry を用います。ユーザー単位での接続は /in、全ユーザー適用は /ga を使用します。/ga の適用にはスプーラー再起動またはログオンが必要です。
@echo off
setlocal
set "PRN=\\PRINTSRV\BizPrinter"
rem 既に接続されているかを wmic で確認
wmic printer get Name /value | find /i "%PRN%" >nul
if %errorlevel%==0 (
echo 既に接続されています: %PRN%
goto :EOF
)
rem ユーザー単位で追加(即時反映)
rundll32 printui.dll,PrintUIEntry /in /n "%PRN%"
if errorlevel 1 (
echo 追加に失敗しました
exit /b 1
)
rem 既定プリンタに設定(任意)
rundll32 printui.dll,PrintUIEntry /y /n "%PRN%"
echo 完了しました。
endlocal
全ユーザーに配布したい場合は以下の通りです。
rundll32 printui.dll,PrintUIEntry /ga /n "%PRN%"
net stop spooler >nul & net start spooler >nul
不要な古い共有プリンタを安全に削除
運用では接続名が変わることがあります。存在確認してから削除するのが安全です。PowerShell と PrintUIEntry の両パターンを示します。
@echo off
setlocal
set "OLD=\\OLDPRINT\Legacy"
powershell -NoProfile -Command "if (Get-Printer -Name '%OLD%' -ErrorAction SilentlyContinue) { Remove-Printer -Name '%OLD%' }"
rundll32 printui.dll,PrintUIEntry /dn /n "%OLD%"
endlocal
共有プリンタのドライバー配布に関する注意
最近の Windows では Point and Print の制限が強化され、プリントサーバー側で適切に署名済みドライバーを配布できる構成でないとユーザー側での接続がブロックされることがあります。あらかじめプリントサーバーで共有プリンタのドライバーを最新化し、クライアント側は管理者権限が不要なポリシーに整えると失敗が減ります。/ia でローカルにインストールさせる方法もありますが、配布や署名の手当てが必要になるため、基本はサーバー配布方式を推奨します。
既定プリンタのポリシー競合対策
ユーザーごとに既定プリンタを固定したい場合、グループポリシーやサードパーティのツールが上書きすることがあります。Set-DefaultPrinter の直後にポリシーが反映されて戻るなら、ログオンスクリプトの末尾で再設定する、またはポリシー側で既定プリンタを配布する設計に寄せると安定します。ローミングプロファイル環境ではユーザーの移動に応じて再設定されるため、スクリプトをログオン時に走らせるとよいでしょう。
接続前の簡易診断とログ出力
失敗時に原因特定を容易にするため、疎通、権限、エラー内容を記録します。以下は標準出力をログに残す雛形です。
@echo off
setlocal
set "PRN=\\PRINTSRV\BizPrinter"
set "LOG=%~dp0printer_setup_%DATE:~0,10%.log"
echo [%DATE% %TIME%] Start >> "%LOG%"
ping -n 1 PRINTSRV >> "%LOG%" 2>&1
powershell -NoProfile -Command "Try { Add-Printer -ConnectionName '%PRN%' -ErrorAction Stop } Catch { $_ | Out-String | Out-File -Append '%LOG%' }"
powershell -NoProfile -Command "Get-Printer | Where Name -eq '%PRN%'" >> "%LOG%" 2>&1
echo [%DATE% %TIME%] End >> "%LOG%"
endlocal
タスクスケジューラで配布を自動化
初回ログオン時や定期的な同期にタスク登録しておくと運用が楽になります。最高権限での実行が必要なら /RL HIGHEST を付けます。
@echo off
set "TASK=Printer-AutoConnect"
set "BAT=%~dp0add_printer.bat"
schtasks /Create /TN "%TASK%" /TR "\"%BAT%\"" /SC ONLOGON /RL HIGHEST /F
まとめ
PowerShell の Add-Printer をバッチから呼び出す方法は成功可否の判定とログ化が容易で、現行の Windows 環境で安定して動作します。互換性重視なら PrintUIEntry を併用し、ユーザー単位の接続(/in)と全ユーザー配布(/ga)を使い分けます。存在確認を行ってから追加や削除を行い、既定プリンタ設定やログ取得、タスク登録まで含めた一連の運用フローを整備すれば、ネットワークプリンタの自動設定を安全かつ再現性高く展開できます。