【bat】ファイル削除で「アクセスが拒否されました」の原因と対処法|del・権限・使用中ファイル

【bat】ファイル削除で「アクセスが拒否されました」が出るときの対策 bat

バッチファイルで del を実行したときに「アクセスが拒否されました」と出る場合、原因は権限不足だけではありません。使用中ファイル、読み取り専用属性、ACL、所有権、長いパスや特殊なファイル名でも同じエラーになります。この記事では、まず確認する順番と、安全に試せる削除テンプレートを原因別にまとめます。

先に結論:最初は del /f を増やすより、「使用中か」「管理者権限か」「属性か」「ACLか」の順で切り分けるのが近道です。いきなり takeownicacls /reset を実行すると、権限設定を必要以上に変えてしまうことがあります。
スポンサーリンク

原因の全体像

症状 最初に確認すること 次の対処
del /f /q でも削除できない ファイルを開いているアプリやサービスがないか ロック元を止めてから再削除
Program FilesWindows 配下で失敗する net session で管理者権限を確認 管理者として実行、または自己昇格
読み取り専用・隠しファイルが消えない attrib 対象ファイル で属性を見る attrib -r -s -h 後に削除
管理者でもアクセス拒否される icacls 対象ファイル でDenyや所有者を見る ACL修正、必要なら所有権取得
変な名前・長いパスのファイルが消えない 末尾スペース、特殊文字、260文字超えを確認 Remove-Item -LiteralPath または \?\
共有フォルダ上のファイルだけ失敗する 共有側とNTFS側の両方の権限を確認 net use で認証し直す

原因①: まず試す安全な削除テンプレート

原因がまだ分からない段階では、対象ファイルの存在確認、属性解除、削除、失敗時のログ出力までを小さくまとめて試すと切り分けやすくなります。システム領域や共有フォルダでは、実行前に対象パスを必ず確認してください。

アクセス拒否時の最初の確認テンプレート
@echo off
setlocal

set "TARGET=C:\data\old.log"
set "LOG=%~dp0delete-access-denied.log"

if not exist "%TARGET%" (
    echo NOT FOUND: "%TARGET%"
    exit /b 0
)

echo [%date% %time%] delete start: "%TARGET%" >>"%LOG%"

rem 読み取り専用・隠し・システム属性を解除してから削除
attrib -r -s -h "%TARGET%" >>"%LOG%" 2>&1
del /f /q "%TARGET%" >>"%LOG%" 2>&1

if exist "%TARGET%" (
    echo DELETE FAILED: "%TARGET%"
    echo ロック、ACL、所有権、パス問題の順で確認してください。
    exit /b 1
)

echo DELETE OK: "%TARGET%"
exit /b 0

ファイルが存在するかどうかを先に判定したい場合は、バッチファイルでファイル存在チェックと条件分岐を実装する方法も参考になります。実行ログを残す運用にしたい場合は、バッチファイルで実行ログを出力する方法に進むと作り込みやすいです。

原因①:ファイルが使用中(プロセスロック)

アプリケーションやサービスがファイルを開いたままにしていると、削除はブロックされます。ログファイル・DLL・設定ファイルなどで起きやすいです。まずどのプロセスがロックしているかを特定します。

ロック元プロセスの特定(handle.exe)
rem Sysinternals の handle.exe を使ってロック元を確認
handle.exe "C:\app\log.txt"

rem または Resource Monitor(タスクマネージャー→パフォーマンス→リソースモニターを開く)
rem CPU タブ → 「関連付けられたハンドルの検索」にファイル名を入力
プロセスを終了してから削除
@echo off
rem アプリを停止してから削除する
taskkill /f /im "myapp.exe" >nul 2>&1
timeout /t 2 >nul
del "C:\app\log.txt"
if errorlevel 1 (
    echo 削除失敗: まだロックされている可能性があります
) else (
    echo 削除成功
)
サービスを停止してから削除
@echo off
net session >nul 2>&1 || goto :no_admin

sc stop MyService >nul 2>&1
set /a W=0
:wait
sc query MyService | findstr /i "STOPPED" >nul 2>&1
if errorlevel 1 (
    timeout /t 2 >nul & set /a W+=2
    if %W% lss 30 goto :wait
    echo タイムアウト & exit /b 1
)
del "C:\app\locked_file.dat"
sc start MyService >nul 2>&1
goto :eof

:no_admin
echo 管理者権限が必要です
exit /b 1

再起動後に削除したい場合は、Windows の「保留中の削除」機能(PendingFileRenameOperations)を使う方法もありますが、レジストリを直接操作するため注意が必要です。再起動が許容できる環境では、単純に再起動後に削除するのが最も確実です。

原因②:管理者権限不足

C:\WindowsC:\Program Files 配下など、OS が保護している領域のファイルは管理者権限なしでは削除できません。バッチを「管理者として実行」するか、自己昇格コードを組み込みます。

管理者権限チェック + 自己昇格
@echo off
net session >nul 2>&1
if errorlevel 1 (
    echo 管理者権限が必要です。再起動します...
    powershell -NoProfile -Command ^
        "Start-Process -FilePath '%~f0' -ArgumentList '%*' -WorkingDirectory '%CD%' -Verb RunAs"
    exit /b
)
echo 管理者権限を確認しました。
del "C:\Program Files\OldApp\unneeded.dll"

管理者権限が必要な処理の詳細はバッチファイルで管理者権限が必要な処理が失敗するときの完全解決ガイドをあわせて参照してください。

原因③:読み取り専用属性

ファイルに読み取り専用(R)・システム(S)・隠し(H)属性が付いていると、del はエラーを返します。attrib コマンドで属性を確認し、解除してから削除します。

属性確認と解除
@echo off
rem 属性を確認
attrib "C:\data\sample.txt"

rem 読み取り専用・システム・隠し属性をすべて解除
attrib -r -s -h "C:\data\sample.txt"
del "C:\data\sample.txt"

rem フォルダ内を再帰的に解除してから削除
attrib -r -s -h "C:\data\*" /s /d
rd /s /q "C:\data"
del /a オプションを使うと、属性を無視して削除を試みることができます。del /a:r で読み取り専用ファイルのみを対象にすることも可能です。
del /a で属性ファイルを強制削除
rem /a:rhs で読み取り専用・隠し・システム属性のファイルも削除対象に
del /f /q /a:rhs "C:\data\locked.tmp"

rem /f は強制削除(読み取り専用も含む)
del /f /q "C:\data\sample.txt"

原因④:ACL(アクセス制御リスト)の拒否設定

NTFSのアクセス許可で「削除の拒否」エントリが設定されていると、管理者権限でも削除が失敗します。icacls で権限を確認し、許可を付与します。ACLの確認や権限変更を詳しく見る場合は、icaclsでACLとアクセス権限を確認・変更する方法も参考にしてください。

icacls で権限確認と付与
@echo off
rem 現在の権限を確認
icacls "C:\data\sample.txt"

rem 現在のユーザーにフルコントロールを付与
icacls "C:\data\sample.txt" /grant "%USERNAME%":F
del "C:\data\sample.txt"

rem フォルダ全体の権限をリセットして継承に戻す
icacls "C:\data" /reset /t /c
注意:icacls の出力に D:AI(Deny)エントリが含まれている場合は拒否エントリを削除する必要があります。icacls "ファイル" /remove:d "%USERNAME%" で拒否エントリを取り除けます。

原因⑤:TrustedInstaller / SYSTEM の所有権

Windowsシステムファイルの多くは所有者が TrustedInstaller に設定されており、管理者でも通常は削除・変更できません。所有権を取得してから権限を付与する必要があります。

所有権取得 + 権限付与 + 削除
@echo off
net session >nul 2>&1 || goto :no_admin

set "TARGET=C:\Windows\System32\sample.dll"

rem 所有権を現在の管理者ユーザーに取得
takeown /f "%TARGET%" /a

rem 管理者グループにフルコントロールを付与
icacls "%TARGET%" /grant Administrators:F

rem 削除
del /f "%TARGET%"

goto :eof
:no_admin
echo 管理者権限が必要です
exit /b 1
警告:Windowsシステムファイルを削除するとOSが不安定になったり起動しなくなる場合があります。削除前に必ずバックアップを取り、本当に削除が必要かどうかを十分確認してください。

原因⑥:ファイル名・パスの問題

末尾にスペースやピリオドが付いたファイル名、特殊文字を含む名前、260文字を超えるパスなど、通常の del では処理できないファイルが存在します。これらは PowerShell の-LiteralPath\\?\ プレフィックスで対処します。

末尾スペース・特殊文字ファイルの削除
rem 末尾にスペースやピリオドが付いたファイルの削除
powershell -NoProfile -Command "Remove-Item -LiteralPath 'C:\data\oddname. ' -Force"

rem 特殊文字([ ] ` など)を含むファイル名
powershell -NoProfile -Command "Remove-Item -LiteralPath 'C:\data\file[1].txt' -Force"

rem NUL や CON などの予約デバイス名ファイル(\\?\ が必要)
del "\\?\C:\data\NUL.txt"
長いパス(MAX_PATH超え)のファイル削除
rem \\?\ プレフィックスで 260 文字制限を回避
del "\\?\C:\very\long\path\to\a\deeply\nested\file.txt"

rem robocopy で空フォルダを同期して中身を消す(長パス対応)
md "%TEMP%\empty_tmp"
robocopy "%TEMP%\empty_tmp" "C:\deep\nested\folder" /purge /mir >nul 2>&1
rd /s /q "C:\deep\nested\folder"
rd "%TEMP%\empty_tmp"

パス長制限の詳細はWindowsのパス長制限(MAX_PATH=260)完全攻略を参照してください。

原因⑦:ネットワーク共有の制限

UNCパスやマップドドライブ経由のファイルは、共有フォルダ側のアクセス権限が影響します。ローカルで管理者権限を持っていても、ネットワーク先で権限がなければ削除できません。

ネットワークドライブの認証と削除
@echo off
rem 認証情報を指定して接続
net use "\\server\share" /user:DOMAIN\User パスワード

rem UNCパスで削除
del "\\server\share\oldfile.txt"

rem 接続を切断
net use "\\server\share" /delete >nul 2>&1

PowerShell を使ったより強力な削除

cmd の del が対処しにくいケースでは PowerShell の Remove-Item が有効です。-Force で読み取り専用・隠し属性を無視し、-LiteralPath で特殊文字を含むパスも正確に指定できます。

PowerShell Remove-Item の使い方
@echo off
rem 単ファイル削除(強制)
powershell -NoProfile -Command "Remove-Item -LiteralPath 'C:\data\file.txt' -Force"

rem フォルダごと再帰削除
powershell -NoProfile -Command "Remove-Item -LiteralPath 'C:\data\old_folder' -Recurse -Force"

rem エラー情報を確認しながら削除
powershell -NoProfile -Command ^
    "try { Remove-Item -LiteralPath 'C:\data\file.txt' -Force } catch { Write-Host $_.Exception.Message }"

削除の再試行パターン

一時的なロックの場合、少し待ってから再試行すると削除できることがあります。ウイルス対策ソフトがファイルを一時的にスキャンしているケースなど、数秒待つだけで解消することがあります。

削除リトライ付きテンプレート
@echo off
setlocal EnableDelayedExpansion
set "TARGET=C:\data\target.txt"
set /a RETRY=0

:del_try
del /f /q "%TARGET%" 2>nul
if exist "%TARGET%" (
    set /a RETRY+=1
    if !RETRY! lss 5 (
        echo リトライ !RETRY!/5... ロックが解除されるのを待機中
        timeout /t 2 >nul
        goto :del_try
    )
    echo 削除失敗: "%TARGET%" はロックされたままです
    exit /b 1
)
echo 削除成功: "%TARGET%"
endlocal
exit /b 0

原因別チェックフロー

確認順序 確認方法 対処
①ファイルが使用中か handle.exe / Resource Monitor で確認 プロセス終了 → 再削除
②管理者権限があるか net session でチェック 管理者として実行
③読み取り専用属性か attrib ファイル名 で確認 attrib -r -s -h → 再削除
④ACL で拒否されているか icacls ファイル名 で Deny エントリ確認 拒否エントリ削除 → 再削除
⑤所有者が TrustedInstaller か icacls の出力で Owner 確認 takeown + icacls /grant → 再削除
⑥パス・ファイル名に問題があるか 末尾スペース・特殊文字・260文字超えを確認 PowerShell -LiteralPath / \\?\ を使う
⑦ネットワーク上のファイルか UNC パスまたはマップドドライブか確認 net use で認証 → 再削除

あわせて確認したい関連記事

よくある質問

Q. del /f /q でも「アクセスが拒否されました」が出るのはなぜですか。
A. /f は読み取り専用属性への対策で、使用中ファイルのロック、ACLの拒否設定、所有権の問題までは解決できません。まずロック元を確認し、次に icacls で権限を見てください。
Q. 使用中のファイルをbatで強制削除できますか。
A. 基本的には、開いているプロセスを止めない限り削除できません。taskkillsc stop で対象アプリやサービスを止めてから削除します。無理に削除するより、停止、待機、再試行の順で組むほうが安全です。
Q. icacls と takeown はどちらを先に使いますか。
A. 先に icacls で現在の権限と所有者を確認します。所有者が原因で権限を付けられない場合だけ takeown を使い、その後に icacls /grant で削除権限を付与します。
Q. フォルダ削除で「アクセスが拒否されました」が出る場合はどうしますか。
A. フォルダ内のどれか1ファイルがロックされていても rd /s /q は失敗します。まず中のファイルを個別に確認し、属性解除、ロック解除、権限確認を行ってからフォルダ削除に戻ると切り分けやすいです。
Q. まず何から確認すればよいですか。
A. 最初はファイルが使用中かを確認し、次に管理者権限、属性、ACLの順で見ます。del /f だけで解決しない場合は、ロックまたは権限設定が原因であることが多いです。
Q. del /f を使っても「アクセスが拒否されました」が出ます。
A. /f は読み取り専用属性のファイルを強制削除するオプションですが、プロセスロックや ACL の拒否設定には効きません。まずロック元プロセスを特定し、必要に応じて icacls で権限を付与してください。
Q. rd /s /q でフォルダを削除しようとしたらエラーになります。
A. フォルダ内のいずれかのファイルがロックされていると、フォルダ全体の削除も失敗します。robocopy 空フォルダ 対象フォルダ /purge で中身を空にしてから rd すると回避できる場合があります。
Q. takeown コマンドで所有権を取得してもまだ削除できません。
A. 所有権の取得だけでは削除権限は付与されません。takeown /f ファイル の後に必ず icacls ファイル /grant Administrators:F を実行して、フルコントロールの権限を追加してください。
Q. 管理者として実行しているのに Program Files 内のファイルが削除できません。
A. アプリケーションが実行中で DLL やファイルをロックしていることが原因の場合が多いです。アプリを先に終了させてください。サービスとして動いている場合は sc stop サービス名 で停止してから削除します。
Q. ウイルス対策ソフトが有効な環境で削除が失敗することがあります。
A. リアルタイムスキャンがファイルを一時的にロックすることがあります。数秒待って再試行するか、除外リストに追加することを検討してください。バッチ内でリトライロジックを組んでおくと安全です。

まとめ

「アクセスが拒否されました」の原因は 1 つではありません。次の順で確認するのが最短経路です。

  • ファイルが別プロセスに使われていないか → handle.exe や Resource Monitor で確認
  • 管理者権限があるか → net session でチェック、なければ自己昇格
  • 読み取り専用・システム属性がないか → attrib -r -s -h で解除
  • ACL に Deny エントリがないか → icacls で確認・削除
  • TrustedInstaller 所有か → takeown + icacls /grant
  • ファイル名・パスに問題があるか → PowerShell -LiteralPath または \\?\