缘起
最近在删除解压的文件时遇到所谓的“权限”问题,折腾了半会,原来是WinRAR预览压缩文件还挂在任务栏,关闭程序后就能删除了。
本着为日后省事着想,写了个结束文件进程、批量关闭文件夹内的程序进程的批处理。之后就不用再去文件夹比对程序排查进程了,解除占用就删除。
应用场景:找不到相关程序进程关闭,或解锁相关程序占用影响文件删除。
注意:该脚本偏向于个人习惯,因我常打开压缩程序不爱关闭,所以额外加入遍历常用解除压缩进程指令,坛友可适当修改代码匹配自身环境。
简单设计
思路:
- 给定相关文件及程序。
- for 遍历给定的最后目录路径
- 提取文件名,批量关闭进程
这期间为了使程序更完善些,我用了powershell的ACL,看上去获取文件所有权很美好,但我实际测试起来也没那么好使,效果不明显,查看改成功的所有者,看上去有些心理安慰,于是又换回batch了。
使用效果
执行
curl -OfsSL https://ghproxy.org/https://raw.githubusercontent.com/hoochanlon/scripts/main/d-bat/unlockapp.bat&&call unlockapp.bat
这里打开了rar、半条命作为演示。
可以看到结束了rar、半条命相关进程。
文件已删除
附源码
链接:https://github.com/hoochanlon/scripts/blob/main/d-bat/unlockapp.bat
@echo off
setlocal
set /p "targetPath=请输入要操作的目录或程序:"
@rem 去除输入路径两边可能存在的引号
set "targetPath=%targetPath:"=%"
@REM 判断路径是否存在
if not exist "%targetPath%" (
echo 指定的路径不存在,已退出。
exit /b
)
@REM 获取路径的目录部分和文件名部分
for %%F in ("%targetPath%") do (
set "actualPath=%%~dpF"
set "fileName=%%~nxF"
)
@REM 构建实际要操作的路径
set "actualPath=%actualPath%%fileName%"
echo --- 开始检测路径程序进程,并关闭。----
@REM 终止给定的进程
taskkill /F /FI "IMAGENAME eq %fileName%" 2>nul
@REM 如果是目录,终止目录及其子目录中所有的 .exe 进程
if exist "%actualPath%\." (
for /r "%actualPath%" %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
echo/
echo --- 开始检测压缩软件占用情况,并关闭。----
@REM 特殊关照:winRAR、7z、360压缩、2345好压、快压
@REM winrar
if exist "C:\Program Files\WinRAR\." (
for /r "C:\Program Files\WinRAR" %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
@REM 7z
if exist "C:\Program Files\7-Zip\." (
for /r "C:\Program Files\7-Zip\." %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
@REM 360压缩
if exist "C:\Program Files (x86)\360\360zip\." (
for /r "C:\Program Files (x86)\360\360zip" %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
@REM 2345 好压
if exist "C:\Program Files\2345Soft\HaoZip\." (
for /r "C:\Program Files\2345Soft\HaoZip" %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
@REM 快压
if exist "C:\Users\hooch\AppData\Roaming\快压\." (
for /r "C:\Users\hooch\AppData\Roaming\快压" %%A in (*.exe) do (
taskkill /F /FI "IMAGENAME eq %%~nxA" 2>nul
)
)
echo ----------------结束 ---------------------
echo/
REM 提示用户选择是否删除文件夹及其所有内容
set /p deleteOption=是否删除 %actualPath% ?(Y/N)
if /I "%deleteOption%"=="Y" (
rd /S /Q "%actualPath%" 2>nul
del /F /Q "%actualPath%" 2>nul
echo 删除操作执行完成。
) else (
if /I "%deleteOption%"=="N" (
echo 已撤销删除操作。
) else (
echo 无效的输入,已退出。
)
)
endlocal
pause
参考
|