在使用del /f命令删除Windows 10 64位系统中的文件时出现"拒绝访问"错误提示。

15

我想要删除1.mp3文件,但是它给了我一个"拒绝访问"的错误提示。

关于该文件权限的更多信息:

attrib 1.mp3
A   C:\Users\Alipour\Desktop\1\1.mp3

我也使用了attrib -s -h 1.mp3

但是仍然无法被删除。

del /f/s/q 1.mp3 > NUL
或者
del /f/s/q 1.mp3
或者
del /f 1.mp3

也许该文件正在被另一个进程访问? - aschipfl
@aschipfl:我已经在我的回答中提到了,但这并没有帮助。 - Andre Kampling
1
NTFS分区上的文件也有ACL(访问控制列表),它们指定用户和组对文件具有哪些权限。 ACL与dir命令显示的权限位完全独立。要查看ACL权限,请在资源管理器中右键单击文件,选择上下文菜单中的“属性”,然后选择“安全”选项卡。 - Michael Burr
4个回答

17

有几种方法可以删除这样的文件:

1. 如果文件正在使用,可使用 Process Explorer:
您可以使用 Windows Sysinternals 的 ProcessExplorer 来确定锁定文件的程序。下载并启动 ProcessExplorer,然后转到 Find|Find Handle or DLL... Ctrl+F 并输入被锁定的文件名:1.mp3

ProcessExplorer 将显示负责访问该文件而导致锁定的进程。如果找到该进程,请终止它并删除该文件。

以下是 MS Word 访问名为 LockedFile.docx 的文件的示例:
ProcessExplorerExample


2. 安全模式启动:
另一种可能性是进入安全模式。在 Windows 8 之前,这可以通过在 Windows 启动前按下 F8 来完成。
在 Windows 8 及更高版本中,您可以在 Windows 启动之前按下 Shift+F8,或者更容易地,在登录屏幕甚至在 Windows 中按住 Shift 并单击“重新启动”。如果时间太短,请单击此处了解如何进入安全模式。

进入安全模式后,您可以再次尝试删除该文件。


3. 通过PendingFileRenameOperations在Windows启动时删除文件:
使用PendingFileRenameOperations,您可以在Windows启动过程中重命名甚至删除文件,当没有其他东西可以访问和阻止该文件时。 PendingFileRenameOperations将输入Windows注册表,并由文件路径对组成。

您可以按照下面描述的手动方式执行此操作,或者再次使用名为MoveFile的Windows Sysinternals程序。下载该程序并在控制台窗口中使用它(开始 -> 运行或 Windows键 +R,键入cmd,然后按ENTER)。
键入movefile foo.exe ""以在重新启动时删除文件。

通过注册表的手动方法:
第一个路径是要重命名的文件。
第二个路径是新文件路径。 如果第二个路径为空(0x0000),则文件将被删除。

  1. 开始 -> 运行 或 Windows键+R
  2. 输入 regedit,并按下 ENTER
  3. 转到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
  4. 创建一个新的多字符串值: PendingFileRenameOperations
  5. 将数据输入为 \??\filepath(例如:\??\C:\Users\xyz\Desktop\foo.exe
  6. 按下 OK
  7. 右键点击该键,选择 修改二进制数据
  8. 在十六进制字符串末尾添加 0000(4个零表示空字符串)
  9. 按下 OK
  10. 重新启动计算机

1
0个匹配项。@andre-kampling - Mohammad Alipour
1
@MohammadAlipour:好奇怪,我扩展了我的答案,也许安全模式会有帮助。 - Andre Kampling
1
你可能想使用PendingFileRenameOperations,它也可以在启动时删除文件,当没有任何东西可以阻止该文件时。此外:这是你的桌面还是别人的?cacls显示该文件的内容是什么?@MohammadAlipour - Marged
1
更简单的方法是使用Sysinternals实用程序。https://technet.microsoft.com/zh-cn/library/2009.06.utilityspotlight.aspx - Marged
@Marged:不错!我已经把它加到答案里了。 - Andre Kampling

1

当使用del /f <FILE>命令删除文件时,如果出现访问被拒绝的错误,您需要首先使用takeownicacls命令行工具获取所有者权限并授权访问。请参考以下示例:在Windows上删除特定文件


1

精简高效的批处理文件替代方案,用于PendingFileRenameOperations
~ 脚本将在右键菜单中添加一个条目 -- "发送到"
~ 接受单个参数,可以是文件或文件夹
~ 确认提示([取消]以清除先前的条目)
~ 基本的傻瓜式防错(例如不处理%Windir%)

Rename_On_Boot.bat

goto="Batch" /* Rename_On_Boot by AveYo v1
:RenOnBoot
set "input=%*" & call set "input=%%input:?=%%"                            &rem line below adds entry to right-click -- "SendTo" menu
if /i "_%~dp0"=="_%APPDATA%\Microsoft\Windows\SendTo\" (set .=) else copy /y "%~f0" "%APPDATA%\Microsoft\Windows\SendTo\" >nul 2>nul
if "_%1"=="_" color 4f & echo   ERROR! No input provided & ping -n 6 localhost >nul & exit /b
for %%# in ("C:\" "C:\Boot" "C:\Recovery" "%WINDIR%" "%WINDIR%\system32" "%ProgramData%" "%ProgramFiles%" "%USERPROFILE%") do (
 if /i "_%input%"=="_%%~#" color 4f & echo   ERROR! %%# is not safe to delete & ping -n 6 localhost >nul & exit /b
)
color 0B & echo   Please wait, folders might take a while .. & call cscript /nologo /e:JScript "%~f0" RenOnBoot "%input%" & exit /b
:RenOnBoot_Run_As_Admin
color 4f & echo   Asking permission to run as Admin.. & call cscript /nologo /e:JScript "%~f0" RunAsAdmin "%~f1???" & exit /b
:"Batch"
@echo off & setlocal disabledelayedexpansion & mode 96,4 & echo. & title %~nx0 by AveYo & if not exist "%~f1" goto :RenOnBoot
reg query HKEY_USERS\S-1-5-20\Environment /v temp 1>nul 2>nul && goto :RenOnBoot || goto :RenOnBoot_Run_As_Admin
:"JScript" */
function RenOnBoot(f){
  var HKLM=0x80000002, k='SYSTEM\\CurrentControlSet\\Control\\Session Manager', v='PendingFileRenameOperations';
  var reg=GetObject('winmgmts:{impersonationLevel=impersonate}!//./root/default:StdRegProv'), ws=WSH.CreateObject('WScript.Shell');  
  var confirmation=ws.Popup(" Rename on next boot? [OK]\n Clear previous entries? [Cancel]\n\n "+f,0,'Rename_On_Boot by AveYo',33);
  if (confirmation == 2) { reg.DeleteValue(HKLM, k, v); WSH.quit(); } // Clear existing entries on Cancel press and quit script
  var mtd=reg.Methods_('GetMultiStringValue').InParameters.SpawnInstance_(); mtd.hDefKey=HKLM; mtd.sSubKeyName=k; mtd.sValueName=v;
  var query=reg.ExecMethod_('GetMultiStringValue', mtd), regvalue=(!query.ReturnValue) ? query.SValue.toArray():[,], entries=[];
  var fso=new ActiveXObject('Scripting.FileSystemObject'), fn=fso.GetAbsolutePathName(f);
  entries.push('\\??\\'+fn,'\\??\\'+fn+'.ren');
  reg.CreateKey(HKLM, k); reg.SetMultiStringValue(HKLM, k, v, entries.concat(regvalue));
}
if (WSH.Arguments.length>=2 && WSH.Arguments(0)=='RenOnBoot') RenOnBoot(WSH.Arguments(1));

function RunAsAdmin(self, arguments) { WSH.CreateObject('Shell.Application').ShellExecute(self, arguments, '', 'runas', 1) }
if (WSH.Arguments.length>=1 && WSH.Arguments(0)=='RunAsAdmin') RunAsAdmin(WSH.ScriptFullName, WSH.Arguments(1));
//

Delete_On_Boot.bat

goto="Batch" /* Delete_On_Boot by AveYo v1
:DelOnBoot
set "input=%*" & call set "input=%%input:?=%%"                            &rem line below adds entry to right-click -- "SendTo" menu
if /i "_%~dp0"=="_%APPDATA%\Microsoft\Windows\SendTo\" (set .=) else copy /y "%~f0" "%APPDATA%\Microsoft\Windows\SendTo\" >nul 2>nul
if "_%1"=="_" color 4f & echo   ERROR! No input provided & ping -n 6 localhost >nul & exit /b
for %%# in ("C:\" "C:\Boot" "C:\Recovery" "%WINDIR%" "%WINDIR%\system32" "%ProgramData%" "%ProgramFiles%" "%USERPROFILE%") do (
 if /i "_%input%"=="_%%~#" color 4f & echo   ERROR! %%# is not safe to delete & ping -n 6 localhost >nul & exit /b
)
color 0B & echo   Please wait, folders might take a while .. & call cscript /nologo /e:JScript "%~f0" DelOnBoot "%input%" & exit /b
:DelOnBoot_Run_As_Admin
color 4f & echo   Asking permission to run as Admin.. & call cscript /nologo /e:JScript "%~f0" RunAsAdmin "%~f1???" & exit /b
:"Batch"
@echo off & setlocal disabledelayedexpansion & mode 96,4 & echo. & title %~nx0 by AveYo & if not exist "%~f1" goto :DelOnBoot
reg query HKEY_USERS\S-1-5-20\Environment /v temp 1>nul 2>nul && goto :DelOnBoot || goto :DelOnBoot_Run_As_Admin
:"JScript" */
function DelOnBoot(f){
  ListDir=function(src, _root,_list) {
    _root=_root || src, _list=_list || [];
    var root=fso.GetFolder(src), files=new Enumerator(root.Files), dirs=new Enumerator(root.SubFolders);
    while (!files.atEnd()) { _list.push(files.item()); files.moveNext(); }
    while (!dirs.atEnd()) { _list=ListDir(dirs.item().path, _root,_list); _list.push(dirs.item()); dirs.moveNext(); }
    return _list;
  };
  var HKLM=0x80000002, k='SYSTEM\\CurrentControlSet\\Control\\Session Manager', v='PendingFileRenameOperations';
  var reg=GetObject('winmgmts:{impersonationLevel=impersonate}!//./root/default:StdRegProv'), ws=WSH.CreateObject('WScript.Shell');  
  var confirmation=ws.Popup(" Delete on next boot? [OK]\n Clear previous entries? [Cancel]\n\n "+f,0,'Delete_On_Boot by AveYo',33);
  if (confirmation == 2) { reg.DeleteValue(HKLM, k, v); WSH.quit(); } // Clear existing entries on Cancel press and quit script
  var mtd=reg.Methods_('GetMultiStringValue').InParameters.SpawnInstance_(); mtd.hDefKey=HKLM; mtd.sSubKeyName=k; mtd.sValueName=v;
  var query=reg.ExecMethod_('GetMultiStringValue', mtd), regvalue=(!query.ReturnValue) ? query.SValue.toArray():[,], entries=[];
  var fso=new ActiveXObject('Scripting.FileSystemObject'), fn=fso.GetAbsolutePathName(f);
  if (fso.FolderExists(fn)) { var list=ListDir(fn); for (var i in list) entries.push('\\??\\'+list[i],''); }
  entries.push('\\??\\'+fn,'');
  reg.CreateKey(HKLM, k); reg.SetMultiStringValue(HKLM, k, v, entries.concat(regvalue));
}
if (WSH.Arguments.length>=2 && WSH.Arguments(0)=='DelOnBoot') DelOnBoot(WSH.Arguments(1));

function RunAsAdmin(self, arguments) { WSH.CreateObject('Shell.Application').ShellExecute(self, arguments, '', 'runas', 1) }
if (WSH.Arguments.length>=1 && WSH.Arguments(0)=='RunAsAdmin') RunAsAdmin(WSH.ScriptFullName, WSH.Arguments(1));
//

0

您可以使用“Process Explorer → 查找 → 查找句柄或DLL”来查找锁定某个文件的程序。

例如,如果锁定者是 explorer.exe,即 Windows资源管理器,则可以在 任务管理器 中结束 Windows资源管理器 后删除该文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接