【批处理】写了个简单的批量结束程序进程占用的小脚本
###缘起最近在删除解压的文件时遇到所谓的“权限”问题,折腾了半会,原来是WinRAR预览压缩文件还挂在任务栏,关闭程序后就能删除了。
本着为日后省事着想,写了个结束文件进程、批量关闭文件夹内的程序进程的批处理。之后就不用再去文件夹比对程序排查进程了,解除占用就删除。
应用场景:找不到相关程序进程关闭,或解锁相关程序占用影响文件删除。
注意:该脚本偏向于个人习惯,因我常打开压缩程序不爱关闭,所以额外加入遍历常用解除压缩进程指令,坛友可适当修改代码匹配自身环境。
### 简单设计
思路:
1. 给定相关文件及程序。
2. for 遍历给定的最后目录路径
3. 提取文件名,批量关闭进程
这期间为了使程序更完善些,我用了powershell的ACL,看上去获取文件所有权很美好,但我实际测试起来也没那么好使,效果不明显,查看改成功的所有者,看上去有些心理安慰,于是又换回batch了。
### 使用效果
执行
```
curl -OfsSL https://ghproxy.org/https://raw.githubusercontent.com/hoochanlon/scripts/main/d-bat/unlockapp.bat&&call unlockapp.bat
```
这里打开了rar、半条命作为演示。
![](https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/PixPin_2024-04-03_16-53-31.png)
可以看到结束了rar、半条命相关进程。
![](https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/PixPin_2024-04-03_16-54-13.png)
文件已删除
![](https://cdn.jsdelivr.net/gh/hoochanlon/scripts/AQUICK/PixPin_2024-04-03_16-54-30.png)
### 附源码
链接: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
)
)
@REM360压缩
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
```
### 参考
* https://en.wikibooks.org/wiki/Windows_Batch_Scripting
* https://www.offidocs.com/public/?v=ext&pdfurl=https://riptutorial.com/Download/batch-file.pdf
* (https://blog.csdn.net/albertsh/article/details/105611277)
* [百度知道-windows 批处理出现“此时不应有×××”](https://zhidao.baidu.com/question/496655777.html) 快压那部分写的是你自己的用户名啊是不是得去修改一下
@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
)
)
可用 %appdata%去替换一下 这个不错。可以有 curl -OfsSL 好评{:1_893:} 学到了!{:1_893:} 看不懂但感觉不错 devSteven 发表于 2024-4-8 17:10
快压那部分写的是你自己的用户名啊是不是得去修改一下
可用 %appdata%
感谢。{:1_921:} 。我都没注意到。笑哭.jpg 感谢大佬分享这个实用的批处理脚本!它可以轻松结束程序佔用,刚刚试用了一下还真的蛮不错的,常常ADB这程序进程都会在,使用了大佬的批次后,节省了我很多麻烦。 看起来不错,感谢大佬哈哈哈 谢谢大佬
页:
[1]
2