バッチファイルから共有フォルダにアクセスするには、ネットワークドライブとして割り当てる方法(net use)とUNCパスを直接指定する方法の2通りがあります。どちらを使うべきか・認証情報の安全な渡し方・接続エラー時の対処まで、実践例を交えて体系的に解説します。
net useコマンドでネットワークドライブをマッピングする方法と主要オプション- UNCパス(
\\サーバー名\フォルダ名)を直接使う方法 - 認証情報(ユーザー名・パスワード)を安全に渡す方法
- 接続済みかどうかを確認してから接続する方法
- System error 5 / 53 / 67 など典型的なエラーの対処法
- robocopy と組み合わせた実践バックアップ・ファイル収集スクリプト
1. net use と UNCパスの使い分け
共有フォルダへのアクセス方法は大きく2つです。どちらを使うべきかの判断基準を整理します。
| 方法 | 使いどき | メリット | デメリット |
|---|---|---|---|
net use(ドライブ割り当て) |
繰り返しアクセスする・複数コマンドで参照する | コードが短くなる・既存のコピーコマンドと相性◎ | 使用後に /delete で解放が必要 |
| UNCパス直接指定 | 一時的なアクセス・シンプルな1回コピー | 割り当て不要・競合しない | コマンドが長くなる・毎回認証が必要な場合あり |
2. net use コマンドの基本
2-1. 基本構文とオプション一覧
net use の基本構文は次のとおりです。
net use [ドライブ文字:] \\サーバー名\共有フォルダ名 [パスワード] [/user:ドメイン\ユーザー名] [オプション]
| オプション | 意味 | 例 |
|---|---|---|
ドライブ文字: |
割り当てるドライブ文字(省略時は * で自動選択) |
Z: |
/user:ユーザー名 |
認証ユーザーを指定 | /user:DOMAIN\admin |
パスワード |
認証パスワード(* で対話入力) |
MyPass または * |
/persistent:yes/no |
Windows 再起動後も接続を維持するか | /persistent:no |
/delete |
ドライブ割り当てを解除 | net use Z: /delete |
*(第1引数) |
利用可能なドライブ文字を自動選択 | net use * \\... |
2-2. 接続・利用・切断の基本パターン
@echo off
setlocal
:: ネットワークドライブを割り当て(認証あり)
net use Z: \\192.168.1.100\share /user:DOMAIN\username MyPassword /persistent:no
:: 接続失敗時は中断
if %errorlevel% neq 0 (
echo [ERROR] 共有フォルダへの接続に失敗しました。
exit /b 1
)
:: 共有フォルダを利用する処理
copy Z:\data\report.csv C:\work\report.csv
:: 必ずドライブ割り当てを解除
net use Z: /delete /y
net use Z: /delete で解放しないと、次回実行時に「ドライブ Z: はすでに割り当てられています」エラーが発生します。exit /b の前に必ず解放してください。エラー発生時でも解放されるよう、goto :cleanup パターンを使うとより安全です(後述)。2-3. 接続済みかチェックしてから接続する
同じドライブへの二重接続を防ぐため、net use(引数なし)の出力を確認してから接続します。
@echo off
setlocal
:: Z: が既に接続済みか確認
net use Z: >nul 2>&1
if %errorlevel% equ 0 (
echo [INFO] Z: は既に接続済みです。再利用します。
) else (
echo [INFO] Z: に接続します...
net use Z: \\fileserver\share /user:admin pass123 /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 接続失敗
exit /b 1
)
)
:: 処理
dir Z:\
:: 解放(自分で接続した場合のみ解放したい場合はフラグ変数を使う)
net use Z: /delete /y
2-4. ドライブ文字を自動選択する(* の使い方)
@echo off
setlocal
:: * で自動選択し、割り当てられたドライブ文字を変数に格納
for /f "tokens=2" %%D in ('net use * \\server01\data /user:admin pass123 /persistent:no') do (
set DRIVE=%%D
)
:: DRIVE 変数に自動割り当てされたドライブ文字が入る(例: "Y:")
echo 割り当てドライブ: %DRIVE%
:: 処理
copy %DRIVE%\report.xlsx C:\output\
:: 解放
net use %DRIVE% /delete /y
3. UNCパスを直接指定する方法
ドライブを割り当てず、\\サーバー名\フォルダ名\ファイル名 の形式で直接アクセスできます。1回だけコピーするような場面ではこちらの方がシンプルです。
@echo off
:: UNCパスで直接コピー(認証済みセッションがある場合)
copy \\192.168.1.100\share\data.csv C:\work\
if %errorlevel% neq 0 (
echo [ERROR] コピーに失敗しました。
exit /b 1
)
echo [OK] コピー完了
認証が必要な場合は、事前に net use \\サーバー名\共有名 で認証セッションを確立してからUNCパスを使うのが確実です。
@echo off
:: まず認証セッションを確立(ドライブ文字なし)
net use \\192.168.1.100\share /user:admin SecretPass /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 認証失敗
exit /b 1
)
:: UNCパスで直接アクセス(ドライブ文字不要)
copy \\192.168.1.100\share\report.csv C:\output\
move \\192.168.1.100\share\archive\*.log C:\logs\
:: セッションを切断
net use \\192.168.1.100\share /delete /y
4. 認証情報を安全に扱う
バッチファイルに
net use Z: \\server\share MyPassword のようにパスワードを直接書くと、ソースコードを見たすべての人にパスワードが漏れます。バッチファイルは平文テキストなので暗号化もされません。以下の安全な方法を使ってください。4-1. 環境変数から読み込む(推奨)
@echo off
:: 事前に環境変数を設定しておく
:: setx SHARE_USER "DOMAIN\username" (管理者コマンドプロンプトで1回実行)
:: setx SHARE_PASS "MyPassword"
net use Z: \\server01\data /user:%SHARE_USER% %SHARE_PASS% /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 接続失敗(環境変数 SHARE_USER/SHARE_PASS を確認してください)
exit /b 1
)
4-2. 実行時にパスワードを入力させる
@echo off
:: ユーザー名は環境変数、パスワードは毎回入力
set /p SHARE_USER=接続ユーザー名を入力してください:
:: パスワードは * を指定して対話入力(コンソールに表示されない)
net use Z: \\server01\share /user:%SHARE_USER% * /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 接続失敗
exit /b 1
)
Windows の資格情報マネージャー(コントロールパネル → 資格情報マネージャー → Windows 資格情報を追加)にサーバーとパスワードを登録しておくと、
net use 時に自動的に認証されます。バッチファイルには認証情報を一切書かず、net use Z: \\server01\share だけで接続可能です。定期実行バッチ(タスクスケジューラー)では最も安全なアプローチです。4-3. 外部ファイルから読み込む(簡易的な隠蔽)
@echo off
:: 認証情報をバッチと別ファイルで管理
:: credentials.txt の内容例:
:: SHARE_USER=DOMAIN\admin
:: SHARE_PASS=SecretPass
for /f "tokens=1,2 delims==" %%A in (credentials.txt) do (
set %%A=%%B
)
net use Z: \\server01\share /user:%SHARE_USER% %SHARE_PASS% /persistent:no
:: 使い終わったら変数をクリア
set SHARE_USER=
set SHARE_PASS=
この方法では credentials.txt を Git 管理から除外(.gitignore)し、アクセス権をバッチ実行ユーザーのみに制限してください。
5. エラーハンドリングと goto :cleanup パターン
5-1. goto :cleanup で確実にドライブを解放する
エラーが途中で発生してもドライブ割り当てが残らないよう、goto :cleanup パターンを使います。
@echo off
setlocal
set DRIVE=Z:
set RESULT=0
:: 接続
net use %DRIVE% \\server01\data /user:%SHARE_USER% %SHARE_PASS% /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 接続失敗 (errorlevel=%errorlevel%)
set RESULT=1
goto :cleanup
)
:: メイン処理
robocopy %DRIVE%\reports C:\backup\reports /e /r:3 /w:5
if %errorlevel% geq 8 (
echo [ERROR] robocopy 失敗
set RESULT=1
goto :cleanup
)
echo [OK] 処理完了
:cleanup
:: エラーの有無に関わらず必ずドライブを解放
net use %DRIVE% /delete /y >nul 2>&1
exit /b %RESULT%
5-2. net helpmsg でエラー詳細を表示する
@echo off
net use Z: \\server01\share /user:admin pass /persistent:no
set ERR=%errorlevel%
if %ERR% neq 0 (
echo [ERROR] net use 失敗 (System error %ERR%)
:: エラーコードの詳細メッセージを表示
net helpmsg %ERR%
exit /b 1
)
6. よくあるエラーと対処法
| エラー番号 | メッセージ | 主な原因 | 対処法 |
|---|---|---|---|
| System error 5 | アクセスが拒否されました | ユーザー名・パスワード間違い / アクセス権なし | 認証情報を確認 / 管理者権限で実行 |
| System error 53 | ネットワークパスが見つかりません | サーバー名/IPが間違い / サーバー停止 / ファイアウォール | ping でサーバー疎通確認 |
| System error 67 | ネットワーク名が見つかりません | 共有フォルダ名が間違い / 共有設定がない | 共有フォルダ名を確認(大文字小文字は区別しない) |
| System error 85 | 指定されたデバイス名はすでに使用されています | 同じドライブ文字がすでに割り当て済み | net use Z: /delete で解放してから再接続 |
| System error 1219 | 複数のユーザー名でアクセスしようとしました | 同一サーバーに別ユーザーで接続済み | net use * /delete で全接続を解放してから再試行 |
:: サーバー疎通確認してから接続するパターン
@echo off
set SERVER=\\192.168.1.100
ping -n 1 192.168.1.100 >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] サーバー 192.168.1.100 に到達できません(System error 53 の可能性)
exit /b 1
)
net use Z: %SERVER%\share /user:admin pass /persistent:no
if %errorlevel% neq 0 (
net helpmsg %errorlevel%
exit /b 1
)
「アクセスが拒否されました(System error 5)」の詳細な原因と対処は アクセスが拒否されましたエラー完全ガイド も参照してください。
7. 実践例3本
実践例1:共有フォルダから毎日レポートをローカルに収集する
@echo off
setlocal
:: 設定
set DRIVE=Z:
set SERVER=\\fileserver01\reports
set LOCAL=C:\collected_reports
set RESULT=0
:: 日付フォルダを作成(例: 2025-03-17)
for /f "tokens=2 delims==" %%A in ('wmic os get LocalDateTime /value ^| find "LocalDateTime"') do (
set DATETIME=%%A
)
set DATEDIR=%DATETIME:~0,4%-%DATETIME:~4,2%-%DATETIME:~6,2%
set OUTDIR=%LOCAL%\%DATEDIR%
if not exist "%OUTDIR%" mkdir "%OUTDIR%"
:: 接続
net use %DRIVE% %SERVER% /user:%SHARE_USER% %SHARE_PASS% /persistent:no
if %errorlevel% neq 0 (
echo [ERROR] 接続失敗
set RESULT=1
goto :cleanup
)
:: 本日のレポートファイルを収集(*.xlsx)
robocopy %DRIVE%\ "%OUTDIR%" *.xlsx /r:3 /w:10 /log:"%LOCAL%\robocopy_%DATEDIR%.log"
:: robocopy の exitcode: 0-7 は正常、8以上はエラー
if %errorlevel% geq 8 (
echo [ERROR] ファイル収集中にエラーが発生しました。ログを確認してください。
set RESULT=1
)
:cleanup
net use %DRIVE% /delete /y >nul 2>&1
echo 終了コード: %RESULT%
exit /b %RESULT%
実践例2:複数サーバーの共有フォルダから一括バックアップ
@echo off
setlocal enabledelayedexpansion
:: バックアップ対象(サーバー:共有名:ローカルバックアップ先)
set SRC[0]=\\srv01\docs
set DST[0]=D:\backup\srv01_docs
set SRC[1]=\\srv02\data
set DST[1]=D:\backup\srv02_data
set SRC[2]=\\srv03\reports
set DST[2]=D:\backup\srv03_reports
set TOTAL_ERR=0
for /l %%i in (0,1,2) do (
echo [%%i] バックアップ開始: !SRC[%%i]! -^> !DST[%%i]!
:: 接続(資格情報マネージャーに登録済みのため /user 不要)
net use "!SRC[%%i]!" /persistent:no >nul 2>&1
if !errorlevel! neq 0 (
echo [ERROR] !SRC[%%i]! への接続失敗。スキップします。
set /a TOTAL_ERR+=1
) else (
robocopy "!SRC[%%i]!" "!DST[%%i]!" /mir /r:2 /w:5 /nfl /ndl
if !errorlevel! geq 8 set /a TOTAL_ERR+=1
net use "!SRC[%%i]!" /delete /y >nul 2>&1
)
)
echo バックアップ完了 (エラー: %TOTAL_ERR% 件)
exit /b %TOTAL_ERR%
実践例3:共有フォルダへのファイル配布(デプロイ)
@echo off
setlocal enabledelayedexpansion
:: 配布先サーバー一覧
set SERVERS=\\ap01\deploy \\ap02\deploy \\ap03\deploy
set SRC=C:\build\output
set RESULT=0
for %%S in (%SERVERS%) do (
echo [INFO] %%S への配布を開始します...
net use %%S /user:%DEPLOY_USER% %DEPLOY_PASS% /persistent:no
if !errorlevel! neq 0 (
echo [ERROR] %%S への接続失敗
set RESULT=1
) else (
robocopy "%SRC%" "%%S" /mir /r:2 /w:5
if !errorlevel! geq 8 (
echo [ERROR] %%S への配布失敗
set RESULT=1
) else (
echo [OK] %%S への配布完了
)
net use %%S /delete /y >nul 2>&1
)
)
exit /b %RESULT%
ファイルコピーの詳細(copy・xcopy・robocopy の使い分け)は ファイルコピー完全ガイド を参照してください。
8. まとめ:場面別チートシート
| 場面 | コマンド |
|---|---|
| ドライブ割り当て(認証あり) | net use Z: \\server\share /user:USER PASS /persistent:no |
| UNCパス直接指定 | copy \\server\share\file.txt C:\dest\ |
| 認証のみ(ドライブ割り当てなし) | net use \\server\share /user:USER PASS /persistent:no |
| 接続状態の確認 | net use(引数なし) |
| ドライブ解放 | net use Z: /delete /y |
| 全接続解放 | net use * /delete /y |
| エラー詳細確認 | net helpmsg エラー番号 |
| 対話パスワード入力 | net use Z: \\server\share /user:USER * |
FAQ
Qnet use と net use /persistent:yes の違いは何ですか?
A/persistent:yes(デフォルト)はドライブ割り当てを Windows 再起動後も維持します。バッチファイルで一時的に使うだけなら /persistent:no を指定してください。/persistent:no にするとログオフ時に自動解放されます。タスクスケジューラーで実行する場合は /persistent:no が推奨です。
Qドメイン参加していないワークグループ環境でも net use は使えますか?
Aはい、使えます。/user:コンピュータ名\ユーザー名 または /user:ユーザー名 の形式で指定します。例:net use Z: \\fileserver\share /user:fileserver\admin pass。ワークグループ環境ではサーバー側に同名のローカルユーザーが存在し、パスワードが一致している必要があります。
QSystem error 1219 が出て接続できません。どうすればよいですか?
A同一サーバーに対して別のユーザー名で接続しようとするとこのエラーが出ます。net use * /delete /y で既存の接続を全て解放してから再接続してください。タスクスケジューラーで実行する場合、前回のバッチが接続を解放し忘れて残っているケースがよくあります。バッチ先頭で net use \\server\share /delete /y >nul 2>&1 を実行してから接続するのも有効です。
Qrobocopy の戻り値が 1 なのにエラー扱いになります。
Arobocopy は戻り値の意味が copy と異なります。0=コピーなし、1=コピー成功、2=追加ファイル、4=不一致ファイルあり、8以上=エラーです。if %errorlevel% geq 8 でエラー判定してください。if %errorlevel% neq 0 にすると正常なコピーもエラー扱いになります。
Qタスクスケジューラーでバッチを実行すると net use がうまく動きません。
A主な原因は①実行ユーザーが異なる(タスクのユーザーと認証情報が合わない)、②/persistent:no を指定していないため前回接続が残っている、③ネットワーク接続が確立する前にバッチが実行される、の3つです。タスクの設定で「最上位の特権で実行する」オプションと、バッチ先頭での既存接続クリア(net use \\server\share /delete /y >nul 2>&1)を試してください。
Qパスワードなし・ゲストアクセスの共有フォルダにもnet useは必要ですか?
A匿名アクセスや同一ドメインユーザーとして自動認証される環境では、net use なしで直接 UNCパスを使えることがあります。ただし環境によって挙動が異なるため、net use \\server\share /persistent:no(認証情報なし)で明示的にセッションを確立してから UNCパスを使う方が安定します。
ユーザー入力でパスワードを受け取る詳細は ユーザー入力を受け取る完全ガイド を参照してください。
