hoochanlon 发表于 2024-4-3 17:33

【批处理】写了个简单的批量结束程序进程占用的小脚本

###缘起

最近在删除解压的文件时遇到所谓的“权限”问题,折腾了半会,原来是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)

devSteven 发表于 2024-4-8 17:10

快压那部分写的是你自己的用户名啊是不是得去修改一下
@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%去替换一下

52soft 发表于 2024-4-3 18:42

这个不错。可以有

lcg2014 发表于 2024-4-3 19:10

curl -OfsSL 好评{:1_893:}

codermo 发表于 2024-4-3 21:09

学到了!{:1_893:}

昔年缔造 发表于 2024-4-3 22:04

看不懂但感觉不错

hoochanlon 发表于 2024-4-9 22:51

devSteven 发表于 2024-4-8 17:10
快压那部分写的是你自己的用户名啊是不是得去修改一下

可用 %appdata%

感谢。{:1_921:} 。我都没注意到。笑哭.jpg

ot1686 发表于 2024-4-11 19:08

感谢大佬分享这个实用的批处理脚本!它可以轻松结束程序佔用,刚刚试用了一下还真的蛮不错的,常常ADB这程序进程都会在,使用了大佬的批次后,节省了我很多麻烦。

doubinanbowan 发表于 2024-4-28 22:59

看起来不错,感谢大佬哈哈哈

wsy1 发表于 2024-4-29 13:39

谢谢大佬
页: [1] 2
查看完整版本: 【批处理】写了个简单的批量结束程序进程占用的小脚本