【bat】バッチファイルでネットワークプリンタを自動設定する方法

【bat】バッチファイルでネットワークプリンタを自動設定する方法 bat

社内に10台・20台のWindowsパソコンがあるとき、ネットワークプリンタの設定を一台一台手動でやっていませんか?入社・PC交換・拠点移動のたびに同じ作業を繰り返すのは、IT担当者にとって大きな時間のロスです。

バッチファイルとPowerShellを組み合わせれば、ネットワークプリンタの追加・既定化・削除をすべて自動化できます。ダブルクリック一発で全プリンタをセットアップでき、タスクスケジューラに登録すればログオン時に自動実行することも可能です。

この記事では、PowerShell Add-PrinterPrintUIEntry(rundll32)という2つのアプローチを詳しく解説し、診断ログ付きの完全版テンプレートや、入社時・拠点移動時などの実践テンプレートまで紹介します。Windows端末管理・社内IT担当者の方に向けて、すぐ使えるスクリプトを揃えました。

スポンサーリンク
  1. ネットワークプリンタ設定の2つのアプローチ
  2. 事前準備:共有プリンタUNCパスの確認と疎通確認
    1. 共有プリンタのUNCパスを調べる
    2. サーバーへの疎通確認
    3. プリンタ名のルールを決めておく
  3. 方法1:PowerShell Add-Printer をバッチから呼び出す基本
    1. 最もシンプルな追加コマンド
    2. Add-Printer の主要パラメータ
  4. 方法1:接続済み確認→未接続なら追加→既定化の一連フロー
  5. 方法1:認証が必要な環境(cmdkeyによる資格情報キャッシュ)
    1. cmdkeyの登録内容を確認・削除する
  6. 方法2:PrintUIEntry(rundll32)でプリンタを追加する
    1. 基本的な追加コマンド
  7. 方法2:ユーザー単位(/in)と全ユーザー配布(/ga)の使い分け
  8. 方法2:PrintUIEntry の主要オプション一覧
  9. 既定プリンタを設定・変更する方法
    1. PowerShellのSet-DefaultPrinterを使う方法
    2. PrintUIEntryの/yオプションを使う方法
  10. 不要なプリンタを削除する方法
    1. PowerShellのRemove-Printerを使う方法
    2. PrintUIEntryの/dnオプションを使う方法
  11. ドライバー自動配布(Point and Print)の仕組みと設定ポイント
    1. Point and Printの動作フロー
    2. Point and Print制限(Windows 10以降の注意点)
    3. グループポリシーでの設定
  12. 診断・ログ出力を組み込んだ完全版バッチテンプレート
  13. 実践テンプレート:入社・PC交換時のプリンタ一括セットアップ
  14. 実践テンプレート:拠点移動時に既定プリンタを自動切替するバッチ
  15. タスクスケジューラでログオン時に自動実行する
    1. GUIでの登録手順
    2. コマンドラインでの登録(schtasks)
    3. タスクスケジューラ設定のポイント
    4. ネットワーク接続後に遅延実行する方法
  16. トラブルシューティング
    1. スプーラーのリセットコマンド
  17. まとめ
  18. あわせて読みたい

ネットワークプリンタ設定の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-Printerwmic 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 「開始」フォルダの設定を忘れずに

ポイント:スクリプトには必ずログ出力と事前の疎通確認を組み込んでください。問題が起きたときにどこで失敗したかをすぐ特定できるようになり、運用の手間が大幅に減ります。

あわせて読みたい