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

news2024/10/7 20:35:55

一、背景

我有个批处理脚本如下:

@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 23156
   40: File          D:\Chen\MySoft\Python\Python3.7.7
  1D0: File          C:\Windows\System32\zh-CN\KernelBase.dll.mui
  1E0: File          F:\test\crawl_record_20230722.log
  208: 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\logs

REM 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: %%f
	for /F "skip=1 tokens=2 delims=," %%p in ('handle /v %%f /nobanner') do taskkill /F /PID %%p
	REM If the move command is executed immediately after the process is deleted, it will fail. Therefore, a 5-second delay is given here
	timeout /T 5 /nobreak > nul
	move %%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.coloradmin.cn/o/782522.html

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

相关文章

关于Swift中闭包和OC中block对局部变量基本数据类型值的捕获

翻了很多文章&#xff0c;发现关于Swift闭包关于上下文变量捕获这块&#xff0c;都没有说的很详细&#xff0c;或者Swift2这样的老版本已经不适用了&#xff0c;问了GPT也是和自己实验的结果不一样&#xff0c;记录下来。 一&#xff1a;OC的block 首先&#xff0c;回顾一下O…

varnish入门

b站视频 官网 docker安装varnish 某位博客园的varnish系列 varnish04-varnish如何使用VCL 3varnish的原理 varnish是什么 varnish的安装 VCL基础 Varnish Configuration Language (VCL)是一种特定于领域的语言&#xff0c;可以用于描述Varnish Cache服务如何处理请求和缓存…

ONE-PEACE论文解读

文章目录 1. 摘要2. 引言3. 算法3.1 结构模态自适应器3.2 模态融合编码器3.3 任务 4. 实验4.1 视觉任务4.2 音频任务4.3 视觉语言任务4.4 消融实验4.5 zero-shot检索 5. 结论 论文&#xff1a; 《ONE-PEACE: EXPLORING ONE GENERAL REPRESENTATION MODEL TOWARD UNLIMITED MOD…

Mysql最左匹配原则和索引下堆

前言&#xff1a; 最左匹配的基础是联合索引 联合索引 联合索引也称为符合索引&#xff0c;适用于多条件查询。 简单说&#xff0c;它是按多个列建立起来的索引&#xff0c;此外联合索引也是有顺序的。 如下图&#xff0c;以A列和B列建立复合索引&#xff0c;某一层节点&…

学习路之PHP--计算2个坐标点之间距离、时间比较

一、计算2个坐标点之间距离 /** * 根据起点坐标和终点坐标测距离 * param [array] $from [起点坐标(经纬度),例如:array(118.012951,36.810024)] * param [array] $to [终点坐标(经纬度)] * param [bool] $km 是否以公里为单位 false:米 true:公里(千米) …

matlab pcnormals()函数的功能 详解

官方解释&#xff1a; pcnormals - Estimate normals for point cloud This MATLAB function returns a matrix that stores a normal for each point in the input ptCloud. normals pcnormals(ptCloud) normals pcnormals(ptCloud,k) 输入参数 ptClo…

捷米特PROFINET总线协议网关介绍

关于PROFINET PROFINET由PROFIBUS国际组织&#xff08;PROFIBUS International&#xff0c;PI&#xff09;推出&#xff0c;是新一代基于工业以太网技术的自动化总线标准。 PROFINET为自动化通信领域提供了一个完整的网络解决方案&#xff0c;囊括了诸如实时以太网、运动控制…

详解 Linux 常用命令

目录 简单介绍 Linux 左侧信息栏 命令 ls ll cd pwd ctrl l touch cat man echo vim vimtutor mkdir rm cp mv grep ps 面试题: 简单介绍 当我们说"Linux"时&#xff0c;通常指的是一种开源的计算机操作系统。Linux 是一个基于 UNIX 操作系…

24.实现线性拟合和相关系数(matlab程序)

1.简述 1. 基本语法 1.1 corr函数基本语法 语法 说明 rho corr(X) 返回输入矩阵X中每对列之间的两两线性相关系数矩阵。 rho corr(X, Y) 返回输入矩阵X和Y中每对列之间的两两相关系数矩阵。 [rho, pval] corr(X, Y) 返回pval&#xff0c;一个p值矩阵&#xff0c…

SpringBoot静态资源访问及参数处理

静态资源访问&#xff1a; 资源访问&#xff1a; 1&#xff1a;Spring Boot 支持静态和模板化的欢迎页面。它首先在配置的静态内容位置中查找index.html文件。如果未找到&#xff0c;则查找index相关模板。如果找到任一&#xff0c;它将自动用作应用程序的欢迎页面。 2&…

【单片机】MSP430F149单片机,晨启,音乐播放器,蜂鸣器音乐

四、音乐播放器 任务要求&#xff1a; 设计制作一个简易音乐播放器&#xff08;通过手柄板上的蜂鸣器发声&#xff0c;播放2到4首音 乐&#xff09;&#xff0c;同时LED模块闪烁&#xff0c;给人视、听觉美的感受。 评分细则&#xff1a; 按下播放按键P15开始播放音乐&#x…

MCP4725介绍和STM32模拟IC2驱动

一.MCP4725 简单总结为下面几个特点。 1路DAC输出 12位分辨率 I2C 接口&#xff08;标准&#xff0c;快速&#xff0c;高速支持&#xff09; 供电电压2.7-5.5 内部EEPROM存储设置 I2C地址可配置&#xff08;A0&#xff09;&#xff08;A1、A2内置&#xff0c;默认为‘00’&…

『Dubbo SPI源码分析』@Adaptive 机制分析

『Dubbo SPI源码分析』Adaptive 机制分析 基于 2.7.0 版本上一章&#xff1a;『Dubbo SPI源码分析』依赖注入机制分析 创建测试 demo 首先创建一个接口&#xff0c;举例为 Car package com.luban.dubbo_spi.api;SPI public interface Car {public void getColor();Adaptive…

pycharm中运行py文件时,报错:找不到自己编写的包等目录问题ModuleNotFoundError: No module named ‘xxx‘

【问题描述】&#xff1a;pycharm中运行py文件时&#xff0c;报错&#xff1a;找不到自己编写的包等目录问题 【报错】: ModuleNotFoundError: No module named ‘xxx’ ERROR: file not found 【问题定位】&#xff1a;运行的py文件和用到的包或者数据不在同一个文件目录下时…

【HanLP】--自然语言处理场景应用

目录 一、前言二、Springboot集成HanLP三、HanLP分词四、HanLP的关键字提取一、前言 HanLP 是由一系列模型与算法组成的工具包,主要功能包括分词、词性标注、关键词提取、自动摘要、依存句法分析、命名实体识别、短语提取、拼音转换、简繁转换等等。 下面将介绍HanLP如何本地…

PHP swoole从入门到精通(一、如何安装swoole及phpStorm服务端代码同步设置)

swoole安装直接在宝塔后台-》安装扩展 phpStorm服务端代码同步设置 https://www.cnblogs.com/yszr/p/9009961.html 软件下载地址 代码上传下载&#xff0c;鼠标右击任何一个文件或者文件夹&#xff0c;选择 Development->上传/下载/同步 点击工具栏Tools->Development…

前端个人年终工作总结精选7篇

一、工作总结的种类 1、按总结的时间分&#xff0c;有年度总结、半年总结、季度总结、学期总结。进行某项重大任务时&#xff0c;还要分期总结或叫阶段总结。 2、按总结的范围分&#xff0c;有单位总结、个人总结、综合性总结、专题总结等。 3、按总结的性质分&#xff0c;有…

科普 | OSI模型

本文简要地介绍 OSI 模型 1’ 2’ 3。 更新&#xff1a;2023 / 7 / 23 科普 | OSI模型 术语节点链路协议网络拓扑 概念作用结构应用层表示层会话层传输层网络层数据链路层物理层 数据如何流动OSI 和TCP/IP 的对应关系和协议参考链接 术语 节点 节点&#xff08; Node &#…

vue基本语法(个人学习笔记一)

目录 友情提醒第一章、vue概述1.1&#xff09;vuej介绍1.2&#xff09;Vue 周边库1.3&#xff09;MVVM的思想 第二章、借助CDN使用Vue2.1&#xff09;vue简单引入&#xff1a;引入js文件2.2&#xff09;简单的Vue程序 第三章、vue的基本语法3.1&#xff09;Vue的数据绑定&#…

在工作中如何对文件进行批量标记和编号

大家在日常工作中&#xff0c;是如何给文件该或文件夹批量重命名或添加编号&#xff0c;有没有怎么好的方法&#xff0c;可以一键批量操作。 经过小编多次操作经验&#xff0c;得到一个结论&#xff0c;可以通过《文件批量改名高手》对这些文件进行批量标记和编号&#xff0c;…