Windows bat 查找文件被哪个进程占用,并终止该进程

一、背景

我有个批处理脚本如下:

@echo off
chcp 936 & cls
cd /D F:\Chen\python3\ExciseC
set fdate=%date:~0,4%%date:~5,2%%date:~8,2%
python main.py >> crawl_record_%fdate%.log 2>&1
for /F %%f in ('dir crawl_record_*.log /B ^| find /V "%fdate%"') do move %%f archived\logs

其中,for /F语句是将除当天之外的log文件,移动到archived\logs,然后这个批处理是在任务计划中定期跑的。
运行一段时间后,偶尔发现仍有当天之外的log文件未被移动到archived\logs,后来定位发现,文件是被python.exe程序给占用了,推测可能是python main.py >> crawl_record_%fdate%.log 2>&1这个条语句在执行过程中非正常结束(如重启、断网等),导致重定向符后的文件被锁定,然后第2天,这个文件无法正常移动。

然后我的需求出现了:找到占用这个文件的进程,然后杀死它,释放被占用的文件,再进行移动操作该文件。(这些步骤都要在批处理内完成,而非图形界面操作)

二、解决问题

1. 查找占用指定文件的进程pid

这里使用handle.exe命令程序,handle.exeSysinternals Suite中的进程实用程序。
它可用于显示系统中任何进程的打开句柄的信息。可以使用它来查看打开了文件的程序,或者查看程序的所有句柄的对象类型和名称。
帮助文档:https://learn.microsoft.com/en-us/sysinternals/downloads/handle
下载地址:https://download.sysinternals.com/files/Handle.zip
下载并解压出 handle.exe / handle64.exe 应用程序,然后把它放到path环境变量里的某个路径下。

handle /v name /nobanner

/v 使输出结果为逗号分隔符的csv格式,name 要搜索的被进程打开的文件名称(接受片段),/nobanner 不显示启动banner和版权信息。更多信息请查看handle /?帮助信息。

输出结果结构如下所示:

C:\Users\cyinl>handle /v /nobanner crawl_record_20230722.log
Process,PID,Type,Handle,Name
python.exe,23156,File,0x000001E0,F:\test\crawl_record_20230722.log

注意:
tasklist也可以查看进程pid,但是它只能按照 exe/dll 模块名来查找,命令格式:
tasklist /M 模块名,像示例中的crawl_record_20230722.log这种文件,是查不到相关进程的。

2. 终止进程

handle.exe可以终止进程,格式:

handle /nobanner /p PID /c <句柄号>

但是,句柄号不太好拿到,如下:

C:\Users\cyinl>handle /nobanner /p 2315640: File          D:\Chen\MySoft\Python\Python3.7.71D0: File          C:\Windows\System32\zh-CN\KernelBase.dll.mui1E0: File          F:\test\crawl_record_20230722.log208: File          C:\Windows\System32\zh-CN\kernel32.dll.mui

第1行的40,应该就是要关闭的进程文件的句柄号,但是能确保要关闭的就是第1行的句柄号???有些困惑。

taskkill命令也可以终止进程,格式:

taskkill /f /pid <进程号>

/f表示强制终止进程,/pid指定要终止进程的pid进程号
输出结果如下示例:

C:\Users\cyinl>taskkill /f /pid 23156
成功: 已终止 PID 为 23156 的进程。

3. 实现代码

handletaskkill两个命令,改进批处理,来解决问题了。具体实现如下:

@echo off
chcp 936 & cls
cd /D F:\Chen\python3\ExciseC
set fdate=%date:~0,4%%date:~5,2%%date:~8,2%
python main.py >> crawl_record_%fdate%.log 2>&1
for /F %%f in ('dir crawl_record_*.log /B ^| find /V "%fdate%"') do move %%f archived\logsREM After the above command is executed, if the files are successfully moved, they will not enter the loop of this command
for /F %%f in ('dir crawl_record_*.log /B ^| find /V "%fdate%"') do (echo the file to move is locked: %%ffor /F "skip=1 tokens=2 delims=," %%p in ('handle /v %%f /nobanner') do taskkill /F /PID %%pREM If the move command is executed immediately after the process is deleted, it will fail. Therefore, a 5-second delay is given heretimeout /T 5 /nobreak > nulmove %%f archived\logs
)

解释:

  1. 如果第1个for /F能正常移动文件的话,就不会进入第2个for /F
  2. 第2个for /F用来查找被占用的log文件,嵌套的第3个for /F获取进程pid,其中skip表示跳过第1行,delims=,表示使用,将数据按列分隔,tokens=2表示取第2列。然后do结构体内使用taskkill命令将查到的pid对应的进程终止掉。
  3. 测试发现,终止进程后,不能立刻去移动文件,否则可能会失败,因此这里用timeout命令给了5秒延时,然后再去移动文件。

三、拓展

手动查找并终止进程

1. 使用系统自带的资源监视器

1)在任务栏搜索资源监视器,切换到CPU选项卡,在关联的句柄-搜索句柄输入框中,输入被占用的文件名称;
2)在搜索结果中,选中需要终止的进程,右键,选择终止进程即可
手动终止进程

2. 使用Process Explorer工具

你也可以使用 Process Explorer ,它是基于handle的GUI版本,Process Explorer可查看有关哪些句柄和DLL进程已打开或加载的信息。
下载地址:https://download.sysinternals.com/files/ProcessExplorer.zip
解压后直接打开procexp.exe/procexp64.exe即可使用。
1)点击搜索图标,输入待查找的文件名称;
2)在搜索结果中,点击搜索结果,会自动定位到相关进程以及文件句柄;
3)右键对应的进程-kill Process 或者 右键对应的文件句柄-close Handle

终止进程或关闭句柄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——异常检测

异常点检测(Outlier detection)&#xff0c;⼜称为离群点检测&#xff0c;是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点&#xff08;outlier&#xff09;是⼀个数据对象&#xff0c;它明显不同于其他的数据对象。异…

Linux工具【1】(编辑器vim、编译器gcc与g++)

vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用&#xff08;g类似&#xff09;预编译编译汇编链接静态库与动态库 总结 引言 vim&#xff08;vi improved&#xff09;编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…

opencv python 训练自己的分类器

源码下载 一、分类器制作 1.样本准备 收集好你所需的正样本&#xff0c;和负样本&#xff0c;分别保存在不同文件夹 在pycharm新建项目&#xff0c;项目结构如下&#xff1a;has_mask文件夹放置正样本&#xff0c;no_mask文件夹放置负样本 安装opencv&#xff0c;把opencv包…

Day.4 刷题练习(自守数)

题目&#xff1a; 例子&#xff1a; 分析题目&#xff1a; 主要目的&#xff1a;给定一个范围小于等于N&#xff0c;在这个范围中找自守数&#xff08;自身等于平方后的尾部数据如5&#xff1a;5 ^ 2 25 &#xff0c; 然后 5 与 平方的后的尾部相等&#xff09; 思路&#x…

ancos注册中心、网关和静态化freemarker、对象存储服务MinIO

1、docker安装ancos ①&#xff1a;docker拉取镜像 docker pull nacos/nacos-server:1.2.0②&#xff1a;创建容器 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0③&#xff1a;访问地址&#xff1a;http://192…

Qt : day4

1.思维导图 2.服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this);}Widget::~Widget() {delete ui;…

下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

【计算机网络】第 3 课 - 计算机网络体系结构

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、常见的计算机网络体系结构 2、计算机网络体系结构分层的必要性 2.1、物理层 2.2、数据链路层 2.3、网路层 2.4、运输层 2…

Sentinel nacos spring cloud 持久化配置---分布式/微服务流量控制

文章目录 sentinel控制台安装目标实现代码地址版本说明maven spring-cloud-starter-alibaba-sentinel依赖yml文件Nacos业务规则配置看源码配置规则SentinelProperties 总配置加载DataSourcePropertiesConfiguration 配置标准的nacos配置注册具体sentinel配置 外传 sentinel控制…

Chrome 115 有哪些值得关注的新特性?

今天带大家一起来了解一下 Chrome 115 值得关注的新特性。 滚动动画 用滚动驱动的动画是网站上非常常见的用户体验模式&#xff0c;比如当页面向前或向后滚动时&#xff0c;对应的动画也会向前或向后移动。 比如下面图中这种比较常见的&#xff0c;页面顶部的进度条随着滚动…

华为OD机试真题 Java 实现【数字涂色】【2022Q4 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

Flowable-UI

title: Flowable-UI date: 2023-7-23 12:19:20 tags: - Flowable Flowable-UI 安装 手把手教大家画了这样一个流程图&#xff0c;虽然说它不是特别好用&#xff0c;但是也不是不能用&#xff0c;也能用。好了&#xff0c;那么接下来的话&#xff0c;我们这个就先告一个段落&…

客户方数据库服务器CPU负载高优化案例

客户方数据库服务器CPU负载高优化案例 背景 上周线上服务出现一个问题&#xff0c;打开某个页面&#xff0c;会导致其它接口请求响应超时&#xff0c;排查后发现数据库响应超400s&#xff0c;之前1s就可查到数据。 具体原因是有个大屏统计页面&#xff0c;会实时查看各业务服…

Netty学习(三)

文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1&#xff0c;短链接方法2&#xff0c;固定长度方法3&#xff0c;固定分隔符方法4&#xff0c…

QT之QMediaPlayer使用播放音频

简介 使用QMediaPlayer播放MP3格式音乐。 播放相关状态流程简述 操作&#xff1a;m_pMediaPlayer->setMedia(); &#xff08;初始化加载&#xff0c;为play()&#xff09; 状态&#xff1a; __onMediaChanged QUrl(“qrc:/sounds/Sounds/Big.mp3”) __onMediaStatusChang…

【javaSE】初识Java

目录 Java是什么 Java语言发展简史 初识Java的main方法 运行Java程序 JDK、JRE、JVM之间的关系 Java中的标识符 Java是什么 Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义. 不仅如此&#xff0c;Java还是一个有一系列计算机软件和规…

Psim 2022仿真软件的安装--Psim电力仿真实战教程

文章目录 Psim 2022 仿真软件安装及使用教程软件介绍1.下载psim 2022安装软件&#xff0c;有需要的亲请联系作者。2.点击安装文件3.点击进行安装&#xff1a;4.安装完成&#xff0c;打开软件&#xff0c;开始仿真5.仿真模型介绍5.1.单相全控整流电路仿真5.2 三相PFC可控整流电路…

红黑树深入剖析【C++】

目录 一、红黑树概念 二、红黑树节点结构设计 三、插入操作 处理情况1 处理情况2 处理情况3 插入总结&#xff1a; 四、插入操作源码 五、红黑树验证 一、红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0…

Selenium+Java环境搭建(测试系列6)

目录 前言&#xff1a; 1.浏览器 1.1下载Chrome浏览器 1.2查看Chrome浏览器版本 1.3下载Chrome浏览器的驱动 2.配置系统环境变量path 3.验证是否成功 4.出现的问题 结束语&#xff1a; 前言&#xff1a; 这节中小编给大家讲解一下有关于Selenium Java环境的搭建&…

Docker 的数据管理 与 Dockerfile

目录 Docker 的数据管理容器互联&#xff08;使用centos镜像&#xff09;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建镜像加载原理 Dockerfile 操作常用的指令&#xff08;1&#xff09;FROM 镜像&#xff…