【bat】バッチファイルで共有フォルダにアクセスする方法|net use・UNCパス・認証・エラー対処まで完全解説

【bat】バッチファイルで共有フォルダにアクセスする方法 bat

バッチファイルから共有フォルダにアクセスするには、ネットワークドライブとして割り当てる方法(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
必ず /delete で解放する
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 の資格情報マネージャー(コントロールパネル → 資格情報マネージャー → 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%

ファイルコピーの詳細(copyxcopyrobocopy の使い分け)は ファイルコピー完全ガイド を参照してください。

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パスを使う方が安定します。

ユーザー入力でパスワードを受け取る詳細は ユーザー入力を受け取る完全ガイド を参照してください。