社内に10台・20台のWindowsパソコンがあるとき、ネットワークプリンタの設定を一台一台手動でやっていませんか?入社・PC交換・拠点移動のたびに同じ作業を繰り返すのは、IT担当者にとって大きな時間のロスです。
バッチファイルとPowerShellを組み合わせれば、ネットワークプリンタの追加・既定化・削除をすべて自動化できます。ダブルクリック一発で全プリンタをセットアップでき、タスクスケジューラに登録すればログオン時に自動実行することも可能です。
この記事では、PowerShell Add-PrinterとPrintUIEntry(rundll32)という2つのアプローチを詳しく解説し、診断ログ付きの完全版テンプレートや、入社時・拠点移動時などの実践テンプレートまで紹介します。Windows端末管理・社内IT担当者の方に向けて、すぐ使えるスクリプトを揃えました。
ネットワークプリンタ設定の2つのアプローチ
バッチファイルからプリンタを追加する方法には大きく2つあります。それぞれの特徴を理解して、環境に合ったものを選びましょう。
| 項目 |
PowerShell Add-Printer |
PrintUIEntry(rundll32) |
| 対応OS |
Windows 8 / Server 2012 以降 |
Windows XP 以降(古い環境も可) |
| 記述量 |
少ない・直感的 |
オプションが多く覚えにくい |
| エラー取得 |
try/catch で容易 |
ERRORLEVEL で判定 |
| 既存確認 |
Get-Printer で簡単 |
wmic や reg query が必要 |
| ユーザー/全員 |
ユーザー単位 |
/in(ユーザー)/ /ga(全員) |
| 推奨用途 |
現代的な環境・新規構築 |
互換性重視・古い端末混在 |
| 管理者権限 |
一部操作で必要 |
/ga は必須・/in は不要な場合あり |
ポイント:特別な理由がなければ PowerShell Add-Printer を選んでください。コードが簡潔で、エラー処理もしやすく、Windows 10/11 環境では最も安定して動作します。
事前準備:共有プリンタUNCパスの確認と疎通確認
スクリプトを実行する前に、接続先プリンタの情報を正確に把握しておく必要があります。
共有プリンタのUNCパスを調べる
ネットワークプリンタは \\サーバー名\共有プリンタ名 の形式(UNCパス)で指定します。UNCパスの確認方法は以下のとおりです。
UNCパスの確認手順
- プリントサーバー側:コントロールパネル → デバイスとプリンター → 共有プリンタを右クリック → プロパティ → 共有タブで「共有名」を確認
- クライアント側:既に接続済みの端末でコマンドプロンプトから
wmic printer get name,portname を実行
- エクスプローラで
\\サーバー名 を開いて共有一覧から確認
サーバーへの疎通確認
プリンタ追加スクリプトを実行する前に、対象サーバーへ通信できるか確認します。
疎通確認コマンド(コマンドプロンプト)
rem サーバーへのping確認
ping -n 2 -w 3000 PrintServer01
rem 共有フォルダへのアクセス確認
net view \\PrintServer01
rem 共有プリンタ一覧の表示
net view \\PrintServer01 /all
プリンタ名のルールを決めておく
バッチ管理を楽にするため、プリンタの表示名(ローカルに登録される名前)はUNCパスと同じにするか、部署・拠点がわかる命名規則を決めておくと管理しやすくなります。
命名規則の例
rem UNCパス: \\PrintSrv\SalesFloor-A3
rem 表示名: 営業部_A3カラー_3F(管理しやすい日本語名も可)
rem 後述のスクリプトでは以下のように変数定義する
set PRINTER_UNC=\\PrintSrv\SalesFloor-A3
set PRINTER_NAME=営業部_A3カラー_3F
方法1:PowerShell Add-Printer をバッチから呼び出す基本
Add-Printer は Windows 8 以降で使えるPowerShellコマンドレットです。バッチファイルから powershell.exe -Command で呼び出します。
最もシンプルな追加コマンド
基本的なAdd-Printer呼び出し
@echo off
rem プリンタのUNCパスを指定してAdd-Printerを実行
powershell.exe -NoProfile -Command "Add-Printer -ConnectionName '\\PrintSrv\SharedPrinter'"
if %ERRORLEVEL% equ 0 (
echo プリンタを追加しました
) else (
echo プリンタの追加に失敗しました
)
注意:-NoProfile は必ず付けてください。ユーザープロファイルの読み込みをスキップして起動を速くし、プロファイルに書かれたカスタム設定がスクリプトに影響しないようにします。
Add-Printer の主要パラメータ
| パラメータ |
説明 |
例 |
-ConnectionName |
共有プリンタのUNCパス(最重要) |
\\Srv\Printer1 |
-Name |
ローカルに登録する表示名 |
営業部プリンタ |
-DriverName |
使用するドライバー名(ローカルポートの場合) |
Canon Generic Plus PCL6 |
-PortName |
接続するポート名 |
IP_192.168.1.10 |
方法1:接続済み確認→未接続なら追加→既定化の一連フロー
実用的なスクリプトでは「既に追加済みなら何もしない」という制御が重要です。Get-Printer で確認してから追加することで、二重登録やエラーを防げます。
確認→追加→既定化の完全フロー
@echo off
setlocal
set PRINTER_UNC=\\PrintSrv\SalesFloor-A3
set PRINTER_NAME=営業部_A3カラー
rem --- 既に登録済みか確認 ---
powershell.exe -NoProfile -Command ^
"$p = Get-Printer -Name '%PRINTER_NAME%' -ErrorAction SilentlyContinue; if ($p) { exit 0 } else { exit 1 }"
if %ERRORLEVEL% equ 0 (
echo [INFO] %PRINTER_NAME% は既に登録されています
goto :set_default
)
rem --- 未登録なら追加 ---
echo [INFO] プリンタを追加しています...
powershell.exe -NoProfile -Command ^
"Add-Printer -ConnectionName '%PRINTER_UNC%'"
if %ERRORLEVEL% neq 0 (
echo [ERROR] プリンタの追加に失敗しました
exit /b 1
)
echo [OK] プリンタを追加しました
rem --- 既定プリンタに設定 ---
:set_default
powershell.exe -NoProfile -Command ^
"(New-Object -ComObject WScript.Network).SetDefaultPrinter('%PRINTER_NAME%')"
if %ERRORLEVEL% equ 0 (
echo [OK] 既定プリンタを設定しました: %PRINTER_NAME%
) else (
echo [WARN] 既定プリンタの設定に失敗しました
)
endlocal
exit /b 0
フローの解説
Get-Printer -ErrorAction SilentlyContinue:プリンタが未登録でもエラーを出さず、変数が空になる
- 登録済みなら
:set_default ラベルに飛び、追加をスキップ
WScript.Network.SetDefaultPrinter:ユーザー単位で既定プリンタを設定(管理者権限不要)
方法1:認証が必要な環境(cmdkeyによる資格情報キャッシュ)
ドメイン外の端末やワークグループ環境では、プリントサーバーへの接続に認証が必要な場合があります。cmdkey コマンドで資格情報をキャッシュすることで、対話的なパスワード入力なしに接続できます。
cmdkeyによる資格情報キャッシュ
@echo off
setlocal
set PRINT_SERVER=PrintSrv
set PRINT_USER=printadmin
set PRINT_PASS=P@ssw0rd
set PRINTER_UNC=\\PrintSrv\SharedPrinter
rem --- 資格情報をキャッシュ(既存があっても上書き) ---
cmdkey /add:%PRINT_SERVER% /user:%PRINT_USER% /pass:%PRINT_PASS%
if %ERRORLEVEL% neq 0 (
echo [ERROR] 資格情報の登録に失敗しました
exit /b 1
)
rem --- プリンタを追加 ---
powershell.exe -NoProfile -Command ^
"Add-Printer -ConnectionName '%PRINTER_UNC%'"
echo [OK] 完了
endlocal
exit /b 0
注意:バッチファイルにパスワードを平文で書くのはセキュリティリスクです。ファイルのアクセス権を適切に制限するか、環境変数や外部の暗号化ファイルからパスワードを取得する設計を検討してください。スクリプトを共有ドライブに置く場合は特に注意が必要です。
cmdkeyの登録内容を確認・削除する
cmdkey 操作コマンド
rem 登録済み資格情報の一覧
cmdkey /list
rem 特定サーバーの資格情報を削除
cmdkey /delete:PrintSrv
方法2:PrintUIEntry(rundll32)でプリンタを追加する
PrintUIEntry は Windows に昔から搭載されている印刷管理ライブラリで、rundll32.exe printui.dll,PrintUIEntry という形式で呼び出します。PowerShellが使えない古い環境や、全ユーザーへの配布(/ga)が必要な場面で活躍します。
基本的な追加コマンド
PrintUIEntryによるプリンタ追加
@echo off
rem ユーザー単位での追加(/in)
rundll32 printui.dll,PrintUIEntry /in /q /n "\\PrintSrv\SharedPrinter"
if %ERRORLEVEL% equ 0 (
echo [OK] プリンタを追加しました
) else (
echo [ERROR] 追加失敗 ERRORLEVEL=%ERRORLEVEL%
)
方法2:ユーザー単位(/in)と全ユーザー配布(/ga)の使い分け
PrintUIEntry には、カレントユーザーにのみ追加する /in と、そのコンピュータの全ユーザーへ配布する /ga があります。
| オプション |
対象範囲 |
管理者権限 |
適した用途 |
/in |
現在のユーザーのみ |
不要(環境による) |
ユーザー自身がログオン時に実行するケース |
/ga |
コンピュータの全ユーザー |
必須 |
管理者がリモートで一括配布するケース |
全ユーザーへの配布(/ga)
@echo off
rem 全ユーザーに配布(管理者権限で実行が必要)
rundll32 printui.dll,PrintUIEntry /ga /q /n "\\PrintSrv\SharedPrinter"
if %ERRORLEVEL% equ 0 (
echo [OK] 全ユーザーへの配布が完了しました
) else (
echo [ERROR] 配布失敗
)
方法2:PrintUIEntry の主要オプション一覧
| オプション |
動作 |
備考 |
/in |
ネットワークプリンタを追加(ユーザー単位) |
最も基本的な追加コマンド |
/ga |
全ユーザーへ配布 |
管理者権限必須 |
/dn |
プリンタを削除 |
/n で対象プリンタを指定 |
/y |
既定プリンタに設定 |
/in や /ga と組み合わせて使用 |
/n "UNCパス" |
対象プリンタのUNCパス指定 |
ほぼすべての操作で使用 |
/q |
エラーダイアログを非表示(サイレント) |
自動実行バッチでは必須 |
/b "表示名" |
プリンタのローカル表示名を指定 |
省略するとUNCパスのプリンタ名になる |
/f INFパス |
ドライバーINFファイルのパス |
ドライバーを手動指定するとき |
/m "ドライバー名" |
使用するドライバー名 |
ローカルポート追加時に使用 |
/e |
プリンタのプロパティUIを表示 |
確認・設定変更用(自動化では非推奨) |
既定プリンタを設定・変更する方法
プリンタを追加した後、既定プリンタを設定する方法は複数あります。環境に合わせて選択してください。
PowerShellのSet-DefaultPrinterを使う方法
Set-DefaultPrinterで既定プリンタを設定
@echo off
rem Set-DefaultPrinter(Windows 8以降)
powershell.exe -NoProfile -Command ^
"(New-Object -ComObject WScript.Network).SetDefaultPrinter('営業部_A3カラー')"
rem または(PowerShell 3.0以降)
powershell.exe -NoProfile -Command ^
"$printer = Get-Printer -Name '営業部_A3カラー'; $printer | Set-DefaultPrinter"
PrintUIEntryの/yオプションを使う方法
PrintUIEntryで既定プリンタを設定
@echo off
rem 追加と同時に既定化(/in /y を組み合わせ)
rundll32 printui.dll,PrintUIEntry /in /y /q /n "\\PrintSrv\SharedPrinter"
rem 既に追加済みのプリンタを既定化するだけの場合
rundll32 printui.dll,PrintUIEntry /y /q /n "\\PrintSrv\SharedPrinter"
ポリシーとの競合に注意
- グループポリシーで既定プリンタが管理されている場合、スクリプトでの設定がポリシー適用時に上書きされることがあります
- 「Windowsが通常使うプリンタを管理する」設定が有効だと、最後に使ったプリンタが自動的に既定になります
- ポリシー確認:設定 → Bluetooth とデバイス → プリンターとスキャナー → 「Windowsで通常使うプリンターを管理する」をオフにすると手動設定が維持されます
不要なプリンタを削除する方法
古いプリンタを削除してから追加しなおす処理や、退職者端末のクリーンアップに使います。
PowerShellのRemove-Printerを使う方法
Remove-Printerで削除
@echo off
set PRINTER_NAME=旧_営業部プリンタ
rem 存在確認してから削除
powershell.exe -NoProfile -Command ^
"$p = Get-Printer -Name '%PRINTER_NAME%' -ErrorAction SilentlyContinue; if ($p) { Remove-Printer -Name '%PRINTER_NAME%'; exit 0 } else { Write-Host '[INFO] 対象プリンタは見つかりません'; exit 0 }"
echo [OK] 削除処理完了
PrintUIEntryの/dnオプションを使う方法
PrintUIEntryで削除
@echo off
rem ユーザー単位の削除(/dn)
rundll32 printui.dll,PrintUIEntry /dn /q /n "\\OldPrintSrv\OldPrinter"
echo 削除コマンド実行完了 ERRORLEVEL=%ERRORLEVEL%
注意:PrintUIEntry /dn は存在しないプリンタを削除しようとするとERRORLEVEL 1になります。事前に Get-Printer や wmic printer で存在確認してから削除するか、エラーを無視するコードを入れてください。
ドライバー自動配布(Point and Print)の仕組みと設定ポイント
Active Directory環境では、プリントサーバーからクライアントへドライバーを自動配布する「Point and Print」という仕組みが使えます。
Point and Printの動作フロー
Point and Print の仕組み
- 1. プリントサーバー側:プリンタを共有し、クライアント用ドライバー(x64/x86)をインストールしておく
- 2. クライアントがAdd-Printer:UNCパスで接続すると、プリントサーバーから自動的にドライバーがダウンロードされる
- 3. ドライバーキャッシュ:一度ダウンロードしたドライバーはキャッシュされ、次回以降は高速
Point and Print制限(Windows 10以降の注意点)
Windows 10 KB5005033以降のアップデートで、Point and Printの動作が変わりました。
| 問題 |
原因 |
対処法 |
| ドライバーインストール時にUAC確認が出る |
KB5005033以降の制限強化 |
GPO「Point and Print の制限」で信頼するサーバーを指定 |
| 「Windowsは一時停止しています」エラー |
未署名ドライバーの拒否 |
署名済みドライバーを使うか、GPOで制限を緩和 |
| x86プリンタをx64で使えない |
アーキテクチャの不一致 |
サーバーにx64/x86両方のドライバーを登録する |
グループポリシーでの設定
GPO設定パス
コンピュータの構成
→ 管理用テンプレート
→ プリンター
→ 「Point and Print の制限」
→ 有効にして「承認されたサーバー」にプリントサーバーのFQDNを追加
診断・ログ出力を組み込んだ完全版バッチテンプレート
実運用では、いつ・どの端末で・何が起きたかをログに残すことが重要です。以下は診断とログ出力を組み込んだ完全版テンプレートです。
printer-setup-full.bat — 完全版テンプレート
@echo off
setlocal enabledelayedexpansion
rem ============================================================
rem ネットワークプリンタ自動設定バッチ(完全版)
rem 実行方法: 管理者として実行 または ユーザーログオン時
rem ============================================================
rem --- 設定値 ---
set PRINT_SERVER=PrintSrv
set PRINTER_UNC=\\PrintSrv\SharedPrinter
set PRINTER_NAME=営業部_プリンタ
set SET_DEFAULT=1
rem --- ログ設定 ---
set LOG_DIR=C:\Logs\PrinterSetup
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"
set LOG_FILE=%LOG_DIR%\printer_setup_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
call :log "=== プリンタセットアップ開始 ==="
call :log "コンピュータ: %COMPUTERNAME%"
call :log "ユーザー: %USERNAME%"
call :log "対象プリンタ: %PRINTER_UNC%"
rem --- サーバー疎通確認 ---
call :log "[STEP1] サーバー疎通確認"
ping -n 1 -w 3000 %PRINT_SERVER% >nul 2>&1
if %ERRORLEVEL% neq 0 (
call :log "[ERROR] %PRINT_SERVER% に到達できません"
call :log "ネットワーク接続またはサーバー状態を確認してください"
exit /b 1
)
call :log "[OK] サーバー疎通確認 OK"
rem --- 既登録確認 ---
call :log "[STEP2] 登録済みプリンタを確認"
powershell.exe -NoProfile -Command ^
"$p = Get-Printer -Name '%PRINTER_NAME%' -ErrorAction SilentlyContinue; if ($p) { exit 0 } else { exit 1 }"
if %ERRORLEVEL% equ 0 (
call :log "[INFO] 既に登録済みです: %PRINTER_NAME%"
goto :step3
)
rem --- プリンタ追加 ---
call :log "[STEP2] プリンタを追加します"
powershell.exe -NoProfile -Command ^
"try { Add-Printer -ConnectionName '%PRINTER_UNC%' -ErrorAction Stop; exit 0 } catch { Write-Host $_.Exception.Message; exit 1 }"
if %ERRORLEVEL% neq 0 (
call :log "[ERROR] プリンタ追加失敗"
exit /b 1
)
call :log "[OK] プリンタを追加しました"
rem --- 既定プリンタ設定 ---
:step3
if %SET_DEFAULT%==1 (
call :log "[STEP3] 既定プリンタを設定します"
powershell.exe -NoProfile -Command ^
"(New-Object -ComObject WScript.Network).SetDefaultPrinter('%PRINTER_NAME%')"
if !ERRORLEVEL! equ 0 (
call :log "[OK] 既定プリンタ設定完了"
) else (
call :log "[WARN] 既定プリンタ設定失敗(手動設定してください)"
)
)
call :log "=== セットアップ完了 ==="
endlocal
exit /b 0
rem --- ログ出力サブルーチン ---
:log
set MSG=[%time%] %~1
echo %MSG%
echo %MSG% >> "%LOG_FILE%"
exit /b 0
実践テンプレート:入社・PC交換時のプリンタ一括セットアップ
入社や端末交換時は、複数のプリンタを一括で追加する需要があります。配列的にプリンタ情報をまとめて処理するテンプレートです。
onboard-printer-setup.bat — 入社・PC交換用一括セットアップ
@echo off
setlocal enabledelayedexpansion
echo ============================================
echo プリンタ一括セットアップ(入社/PC交換用)
echo ============================================
rem --- 追加するプリンタのリスト(UNCパス)---
rem 書式: PRINTER_N=\\サーバー\共有名
set PRINTER_1=\\PrintSrv\SalesA3Color
set PRINTER_2=\\PrintSrv\SalesMono
set PRINTER_3=\\PrintSrv\CommonFax
set PRINTER_COUNT=3
rem 既定にするプリンタ番号(0=設定なし)
set DEFAULT_PRINTER_NUM=1
rem --- ループで追加 ---
set SUCCESS_COUNT=0
set ERROR_COUNT=0
for /L %%i in (1,1,%PRINTER_COUNT%) do (
set TARGET=!PRINTER_%%i!
echo.
echo [%%i/%PRINTER_COUNT%] 追加中: !TARGET!
rem 既登録確認
powershell.exe -NoProfile -Command ^
"$p=Get-Printer|Where-Object{$_.DeviceUri -eq '!TARGET!'};if($p){exit 0}else{exit 1}" >nul 2>&1
if !ERRORLEVEL! equ 0 (
echo [SKIP] 既に登録済みです
) else (
powershell.exe -NoProfile -Command ^
"try{Add-Printer -ConnectionName '!TARGET!' -EA Stop;exit 0}catch{exit 1}" >nul 2>&1
if !ERRORLEVEL! equ 0 (
echo [OK] 追加完了
set /a SUCCESS_COUNT+=1
) else (
echo [ERROR] 追加失敗
set /a ERROR_COUNT+=1
)
)
rem 既定プリンタの設定
if %%i equ %DEFAULT_PRINTER_NUM% (
powershell.exe -NoProfile -Command ^
"$printers=Get-Printer;$p=$printers|Where-Object{$_.DeviceUri -eq '!TARGET!'};if($p){(New-Object -ComObject WScript.Network).SetDefaultPrinter($p.Name)}"
echo [OK] 既定プリンタに設定しました
)
)
echo.
echo --- 完了 ---
echo 追加成功: %SUCCESS_COUNT% 件
echo エラー: %ERROR_COUNT% 件
if %ERROR_COUNT% gtr 0 (
exit /b 1
) else (
exit /b 0
)
endlocal
実践テンプレート:拠点移動時に既定プリンタを自動切替するバッチ
複数拠点を持つ企業では、端末が接続するネットワークに応じて既定プリンタを自動切替したいというニーズがあります。サブネットやホスト名で拠点を判定して既定プリンタを切り替えるテンプレートです。
location-printer-switch.bat — 拠点移動時の自動切替
@echo off
setlocal enabledelayedexpansion
echo 拠点判定中...
rem --- 現在のIPアドレスを取得してサブネット判定 ---
for /f "tokens=2 delims=:" %%A in ('ipconfig | findstr /i "IPv4"') do (
set IP=%%A
set IP=!IP: =!
)
echo 現在のIP: %IP%
rem --- サブネットで拠点を判定 ---
set LOCATION=UNKNOWN
echo %IP% | findstr /b "192.168.1." >nul
if %ERRORLEVEL% equ 0 set LOCATION=TOKYO
echo %IP% | findstr /b "192.168.2." >nul
if %ERRORLEVEL% equ 0 set LOCATION=OSAKA
echo %IP% | findstr /b "10.0.0." >nul
if %ERRORLEVEL% equ 0 set LOCATION=NAGOYA
echo 拠点: %LOCATION%
rem --- 拠点別のプリンタを設定 ---
if %LOCATION%==TOKYO (
set PRINTER_UNC=\\TokyoPrintSrv\MainPrinter
set PRINTER_NAME=東京本社_カラー
)
if %LOCATION%==OSAKA (
set PRINTER_UNC=\\OsakaPrintSrv\FloorPrinter
set PRINTER_NAME=大阪支社_モノクロ
)
if %LOCATION%==NAGOYA (
set PRINTER_UNC=\\NagoyaPrintSrv\OfficePrinter
set PRINTER_NAME=名古屋_複合機
)
if %LOCATION%==UNKNOWN (
echo [WARN] 拠点が特定できませんでした。ネットワーク接続を確認してください。
exit /b 1
)
rem --- プリンタが未登録なら追加 ---
powershell.exe -NoProfile -Command ^
"$p=Get-Printer -Name '%PRINTER_NAME%' -EA SilentlyContinue;if(-not $p){Add-Printer -ConnectionName '%PRINTER_UNC%'}"
rem --- 既定プリンタに設定 ---
powershell.exe -NoProfile -Command ^
"(New-Object -ComObject WScript.Network).SetDefaultPrinter('%PRINTER_NAME%')"
echo [OK] 既定プリンタを切り替えました: %PRINTER_NAME%
endlocal
exit /b 0
拠点切替テンプレートのカスタマイズポイント
- サブネット判定の代わりに
%USERDNSDOMAIN%(ADドメイン名)や %LOGONSERVER% を使うと、より確実に拠点を判定できる
- VPN接続時のアドレス範囲も判定条件に追加すると在宅勤務時にも対応できる
- このスクリプトをタスクスケジューラでネットワーク接続イベントに紐付けると、接続時に自動実行できる
タスクスケジューラでログオン時に自動実行する
バッチファイルをタスクスケジューラに登録することで、ユーザーのログオン時に自動でプリンタをセットアップできます。
GUIでの登録手順
タスクスケジューラへの登録手順
- 1. タスクスケジューラを開く(
taskschd.msc)
- 2. 右ペインで「タスクの作成」をクリック
- 3. 全般タブ:名前を入力(例:「プリンタ自動設定」)
- 4. トリガータブ:「新規」→「ログオン時」を選択、「特定のユーザー」または「すべてのユーザー」
- 5. 操作タブ:「新規」→ プログラム/スクリプトに
cmd.exe、引数に /c "C:\Scripts\printer-setup.bat"
- 6. 開始(オプション)にバッチファイルのあるフォルダパスを入力(重要)
- 7. 「完了」
コマンドラインでの登録(schtasks)
schtasksでタスクを登録
@echo off
rem タスクを登録(管理者権限で実行)
schtasks /create ^
/tn "PrinterAutoSetup" ^
/tr "cmd.exe /c \"C:\Scripts\printer-setup.bat\"" ^
/sc onlogon ^
/ru "%USERDOMAIN%\%USERNAME%" ^
/f
if %ERRORLEVEL% equ 0 (
echo [OK] タスクを登録しました
) else (
echo [ERROR] タスク登録失敗
)
rem タスクの確認
schtasks /query /tn "PrinterAutoSetup" /fo list
タスクスケジューラ設定のポイント
| 設定項目 |
推奨値・注意点 |
| トリガー |
「ログオン時」が推奨。「起動時」ではネットワーク未接続の場合がある |
| 実行ユーザー |
ユーザー単位の追加(/in)なら「ログオンしているユーザー」で実行 |
| 開始(オプション) |
バッチファイルのあるフォルダを必ず指定(省略するとSystem32が基点になる) |
| 遅延 |
ログオン直後はネットワークが安定していない場合があるため、30秒〜1分の遅延を設定する |
| 停止時間 |
「次の時間が経過したらタスクを停止する」を3〜5分に設定し、ハングアップを防ぐ |
ネットワーク接続後に遅延実行する方法
ネットワーク確認後にセットアップを実行
@echo off
setlocal
set PRINT_SERVER=PrintSrv
set MAX_WAIT=60
set WAIT_COUNT=0
rem ネットワーク疎通が確認できるまで最大60秒待機
:wait_loop
ping -n 1 -w 1000 %PRINT_SERVER% >nul 2>&1
if %ERRORLEVEL% equ 0 goto :start_setup
set /a WAIT_COUNT+=1
if %WAIT_COUNT% geq %MAX_WAIT% (
echo [ERROR] タイムアウト: サーバーに接続できませんでした
exit /b 1
)
ping -n 2 localhost >nul
goto :wait_loop
:start_setup
echo [OK] ネットワーク確認 OK(%WAIT_COUNT%秒待機)
call printer-setup.bat
endlocal
exit /b 0
トラブルシューティング
| 症状・エラー |
原因 |
対処法 |
| 「指定されたプリンタが見つかりません」 |
UNCパスの誤り・サーバー停止 |
net view \\サーバー名 で共有一覧を確認。pingでサーバー死活確認 |
| 「アクセスが拒否されました」 |
認証エラー・権限不足 |
cmdkey で資格情報をキャッシュ。ドメイン参加端末ならドメイン認証を確認 |
| ドライバーのインストールでUACが出る |
KB5005033以降の制限 |
管理者として実行、またはGPOで信頼するサーバーを設定 |
| Add-Printer が「サポートされていません」エラー |
Windows 7などの古いOS |
PrintUIEntry(/in)を使う |
| タスクスケジューラで動かない |
「開始(オプション)」が未設定 |
バッチのあるフォルダパスを「開始」欄に設定 |
| 既定プリンタが毎回変わってしまう |
「Windowsが通常使うプリンタを管理する」が有効 |
設定 → Bluetooth とデバイス → プリンターとスキャナー → 当該設定をオフ |
| グループポリシーで既定設定が上書きされる |
GPOでプリンタ配布が設定されている |
IT管理者にGPO設定を確認。スクリプトとGPOの優先順位を調整 |
| PowerShellのExecutionPolicyエラー |
スクリプト実行ポリシーの制限 |
powershell.exe -ExecutionPolicy Bypass -Command ... を使う |
| プリンタはあるが印刷されない |
ドライバーのアーキテクチャ不一致・スプーラーエラー |
プリントスプーラーを再起動:net stop spooler && net start spooler |
| 「プリンターに接続できません。ドライバーが必要です」 |
サーバーにドライバーが登録されていない |
サーバー側でクライアント用ドライバーを追加配布の設定をする |
| スクリプトが止まる・応答しない |
ネットワーク待ち・ドライバーインストール待ち |
事前にpingで疎通確認。タスクスケジューラに停止時間を設定 |
スプーラーのリセットコマンド
プリントスプーラーのリセット(管理者権限で実行)
@echo off
echo プリントスプーラーをリセットします...
rem スプーラー停止
net stop spooler /y
rem スプールキューの削除
del /q /f %SystemRoot%\System32\spool\PRINTERS\*.* >nul 2>&1
rem スプーラー起動
net start spooler
echo [OK] スプーラーのリセット完了
まとめ
バッチファイルとPowerShellを組み合わせることで、ネットワークプリンタの設定作業を完全に自動化できます。この記事で解説した内容を整理します。
| やりたいこと |
推奨コマンド |
備考 |
| プリンタ追加(現代的環境) |
Add-Printer -ConnectionName |
Win8以降推奨 |
| プリンタ追加(互換重視) |
PrintUIEntry /in |
XP以降対応 |
| 全ユーザーへの配布 |
PrintUIEntry /ga |
管理者権限必須 |
| 既定プリンタの設定 |
WScript.Network.SetDefaultPrinter |
ユーザー単位 |
| プリンタ削除 |
Remove-Printer / PrintUIEntry /dn |
事前に存在確認推奨 |
| 資格情報のキャッシュ |
cmdkey /add |
ワークグループ環境で有効 |
| ログオン時自動実行 |
schtasks /sc onlogon |
「開始」フォルダの設定を忘れずに |
ポイント:スクリプトには必ずログ出力と事前の疎通確認を組み込んでください。問題が起きたときにどこで失敗したかをすぐ特定できるようになり、運用の手間が大幅に減ります。
あわせて読みたい