在 windows 10 64bit 中使用 del /f 时访问被拒绝

Posted

技术标签:

【中文标题】在 windows 10 64bit 中使用 del /f 时访问被拒绝【英文标题】:Access is denied when use del /f in windows 10 64bit 【发布时间】:2017-12-09 04:28:19 【问题描述】:

我要删除 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:我已经在回答中提到了这一点,但这无济于事。 NTFS 分区上的文件也有 ACL(访问控制列表),它指定用户和组对文件的权限。 ACL 与 dir 命令显示的权限位完全分开。要查看 ACL 权限,请在资源管理器中右键单击文件,在上下文菜单中选择“属性”,然后选择“安全”选项卡。 【参考方案1】:

您可以通过“进程资源管理器 → 查找 → 查找句柄或 DLL”来找出哪个程序正在锁定某个文件。

例如,如果locker是explorer.exeWindows资源管理器,你可以在任务管理器中杀死Windows资源管理器后删除文件>.

【讨论】:

【参考方案2】:

精益和平均PendingFileRenameOperations的仅批处理文件替代方案: ~ 脚本将添加一个条目以右键单击 -- “SendTo”菜单 ~ 接受单个参数,文件或文件夹 ~ 确认提示([取消]清除以前的条目) ~ 基本的白痴打样(例如,不要处理 %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));
//

【讨论】:

【参考方案3】:

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

1.进程资源管理器(如果文件正在使用中): 您可以使用 Windows Sysinternals 中的ProcessExplorer 来识别锁定文件的程序。下载并启动 ProcessExplorer 并转到 Find|Find Handle or DLL... Ctrl+F 并输入锁定文件的名称:1.mp3

ProcessExplorer 将显示因访问文件而导致锁定的进程。如果你有进程杀死那个并删除文件。

MS Word 访问名为 LockedFile.docx 的文件的示例:


2。安全模式启动: 另一种可能性是启动进入安全模式。在 Windows 8 之前的时代,这是通过在 Windows 启动前按 F8 来完成的。 在 Windows 8 和更高版本中,您可以在 Windows 启动之前按 Shift+F8 或更轻松地按住 Shift 并单击登录屏幕中的重新启动或即使在 Windows 中。如果这太短,请查看 here 如何进入安全模式。

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


3.通过 PendingFileRenameOperations 在 Windows 启动时删除文件: 使用 PendingFileRenameOperations,您可以在 Windows 启动过程中重命名甚至删除文件,而其他任何人都无法访问和阻止该文件。 PendingFileRenameOperations 将被输入到 Windows 注册表中,由成对的文件路径组成。

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

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

    开始 -> 运行或 Windows-Key+R 输入regedit,然后按ENTER 转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 创建一个新的多字符串值PendingFileRenameOperations 输入\??\filepath作为数据(例如\??\C:\Users\xyz\Desktop\foo.exe) 按确定 右键单击该键,单击修改二进制数据 在十六进制字符串的末尾,添加0000(4 个零代表一个空字符串) 按确定 重新启动计算机

【讨论】:

0 个匹配项。 @andre-kampling @MohammadAlipour:好吧,奇怪,我扩展了我的答案,也许安全模式会有所帮助。 您可能想要使用 PendingFileRenameOperations,它也可以在启动期间删除,当没有任何东西可以阻止该文件时。除此之外:这是您的桌面还是其他人? cacls 为文件显示什么? @MohammadAlipour 更简单:再次使用 sysinternals 实用程序。 technet.microsoft.com/en-us/library/… @Marged:太好了!我将其添加到答案中。

以上是关于在 windows 10 64bit 中使用 del /f 时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

windows10 64bit 下的tensorflow 安装及demo

32 bit 与 64 bit 程序如何识别?

windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速

系统:Windows® 7 64-bit / Windows® 8 64-bit /Windows

window 10 64bit Tortoise SVN 图标状态显示不正常

如何在 Windows 上构建 gettext 64bit dll。