标题: [系统相关] 【已解决】批处理对多个同名不同版本的exe进程根据版本号有选择性的强制关闭 [打印本页]
作者: solan 时间: 2017-3-27 12:05 标题: 【已解决】批处理对多个同名不同版本的exe进程根据版本号有选择性的强制关闭
本帖最后由 solan 于 2017-4-1 12:14 编辑
如题
批处理准对多个同名不同版本的exe进程根据版本号有选择性的强制关闭,比如abc.exe进程有多个不同版本同时运行,我想把大于2.1.0.0的所有同名进程强制关闭,
我搜索了本论坛的帖子,自己也没办法解决,只好求助老师,拜托拜托啦
作者: solan 时间: 2017-3-27 12:33
请老师们帮帮忙,这样的批处理怎么写啊
作者: ShowCode 时间: 2017-3-27 12:52
- wmic process where "name='QQ.exe'" get * /value
复制代码
先看看这个命令的结果里面有没有你需要的版本号
作者: solan 时间: 2017-3-27 13:31
回复 3# ShowCode
没有哦
作者: ShowCode 时间: 2017-3-27 13:37
回复 4# solan
请举例说明一下你的版本是在哪里看到的
作者: solan 时间: 2017-3-27 13:38
我在你的代码里面加个pause
在黑框里面没看到我的qq的版本号
作者: solan 时间: 2017-3-27 13:42
版本号在文件属性里面看到
作者: Nsqs 时间: 2017-3-27 13:43
本帖最后由 Nsqs 于 2017-3-27 13:45 编辑
- @PowerShell -Command "ForEach ($1 in (Get-Process -Name "qq").Path){[System.Diagnostics.FileVersionInfo]::GetVersionInfo($1).FileVersion};[Console]::Readkey()"
复制代码
作者: pcl_test 时间: 2017-3-27 13:47
通过进程获取exe实际路径,通过实际exe的属性获取版本
wmic process
wmic datafile
taskkill
作者: solan 时间: 2017-3-27 14:07
回复 9# pcl_test
一语惊醒啊,我试试
作者: solan 时间: 2017-3-27 14:21
不行啊,我写不出来- @echo off
- set w=wmic process where "name='lmgrd.exe'" get executablepath
- for /f "tokens=*" %%a in ('%w% 2^>nul ^| find "\"') do set "ph=%%~dpa"
- wmic "%ph%lmgrd.exe"
- pause
复制代码
作者: solan 时间: 2017-3-27 14:22
请版主老大帮忙啊
作者: Nsqs 时间: 2017-3-27 15:22
回复 12# solan - @PowerShell -Command "$p=(Get-Process -Name "qq");ForEach ($i in $p){$i.path+' 的版本号是 '+[System.Diagnostics.FileVersionInfo]::GetVersionInfo($i.path).FileVersion;Stop-Process -id $i.id -Confirm};[Console]::Readkey()"
复制代码
会提示结束进程
作者: solan 时间: 2017-3-27 15:26
回复 13# Nsqs
谢谢,我试试
作者: solan 时间: 2017-3-27 15:27
回复 13# Nsqs
C:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe 的版本号是 8.3.18038.0
确认
是否确实要执行此操作?
正在目标“QQ (10476)”上执行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”):
作者: solan 时间: 2017-3-27 15:31
回复 13# Nsqs
我用其他的进程(多个同名)就出错
使用“1”个参数调用“GetVersionInfo”时发生异常:“路径的形式不合法。”
所在位置 行:1 字符: 49
+ ... ($i in $p){$i.path+' 的版本号是 '+[System.Diagnostics.FileVersionInfo]::G ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException
确认
是否确实要执行此操作?
正在目标“lmgrd (10360)”上执行操作“Stop-Process”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”):
作者: Nsqs 时间: 2017-3-27 15:50
回复 16# solan
我这里测试结束3个qq进程都可以获取
作者: Nsqs 时间: 2017-3-27 15:55
- @PowerShell -Command "$p=(Get-Process -Name "notepad");ForEach ($i in $p){$i.path+' 的版本号是 '+[System.Diagnostics.FileVersionInfo]::GetVersionInfo($i.path).FileVersion;Stop-Process -id $i.id -Confirm};[Console]::Readkey()"
复制代码
我这里记事本也是正常的,不知道你的是怎么回事你可以用下面代码看看路径有没有错- @PowerShell -Command "$p=(Get-Process -Name "notepad");ForEach ($i in $p){$i.path};[Console]::Readkey()"
复制代码
作者: solan 时间: 2017-3-27 16:05
回复 18# Nsqs
记事本进程没错,换成我的lmgrd.exe进程就出错
作者: solan 时间: 2017-3-27 16:05
我的进程是有系统服务开启后产生的
作者: solan 时间: 2017-3-27 16:06
有好几个服务,但是开启后产生的进程是同名的
作者: solan 时间: 2017-3-27 16:11
回复 18# Nsqs
我知道了,我测试了多个普通程序的进程,用你的代码没错
但是是服务产生的进程,就出错
作者: Nsqs 时间: 2017-3-27 16:27
本帖最后由 Nsqs 于 2017-3-27 16:29 编辑
回复 22# solan
如果你需要关闭进程的话还有一种方法是判断进程窗口的标题来定位,这个方法,比获取路径更准确.因为也有可能出现同一个进程同一个路径同一个版本号却不同名标题.当然也可以只考虑版本号就行
作者: solan 时间: 2017-3-27 16:36
回复 23# Nsqs
我的进程是服务的进程,是没有窗口标题的哦
让你麻烦了,还得谢谢你啊
作者: solan 时间: 2017-3-27 16:40
回复 9# pcl_test
老大,具体怎么写啊,我学得不怎么样啊,知道的少,麻烦你了
作者: ShowCode 时间: 2017-3-27 21:45
试试这样能否获取到你需要的版本号- @echo off
- for /f "tokens=2 delims==" %%i in ('wmic process where "name='QQ.exe'" get executablepath /value ^| findstr "="') do (
- set "FullPath=%%i"
- )
- set "FullPath=%FullPath:\=\\%"
- wmic datafile where "Name='%FullPath%'" get Version /value
- pause
复制代码
作者: pcl_test 时间: 2017-3-28 06:08
- wmic process where "name='lmgrd.exe'" get executablepath,processid>result.txt
- pause
复制代码
把生成的txt文件压缩打包上传附件
作者: solan 时间: 2017-3-28 08:49
回复 26# ShowCode
结果如下
没有可用实例。
节点 - WIN10-703210732
错误:
描述 = 无效查询
请按任意键继续. . .
作者: solan 时间: 2017-3-28 08:53
回复 27# pcl_test
我现在怎么上传不了,我就复制内容吧:
ExecutablePath ProcessId
22012
7348
47780
29360
作者: ygqiang 时间: 2017-3-28 09:53
回复 26# ShowCode
win7 64系统,测试正常。
作者: solan 时间: 2017-3-28 10:04
回复 30# ygqiang
谢谢你了,不过我的是win10系统哦
作者: pcl_test 时间: 2017-3-28 10:04
回复 29# solan - (
- wmic process where "name='lmgrd.exe'" get *
- echo;==============
- wmic service get *
- )>result.txt
- pause
复制代码
将result.txt用网盘分享出来
作者: solan 时间: 2017-3-28 10:35
本帖最后由 solan 于 2017-3-28 10:38 编辑
回复 26# ShowCode
你的对的,我刚才测试的时候搞错,你的代码运行显示:
Version=8.3.18038.0
请按任意键继续. . .
但是换了我的服务进程lmgrd.exe就不对了
没有可用实例。
请按任意键继续. . .
作者: solan 时间: 2017-3-28 10:41
回复 32# pcl_test
谢谢老大 链接:http://pan.baidu.com/s/1bpgopYZ 密码:zlof
作者: pcl_test 时间: 2017-3-28 11:31
本帖最后由 pcl_test 于 2017-3-28 11:52 编辑
- @echo off
- for /f %%a in ('wmic process where "name='lmgrd.exe'" get ProcessId /value 2^>nul ^|find "="') do (
- setlocal enabledelayedexpansion
- set %%a
- for /f "delims=" %%b in ('wmic service where "ProcessId='!ProcessId!'" get PathName /value 2^>nul ^|find "="') do set %%b
- for /f %%c in ('wmic datafile where "Name='!PathName:\=\\!'" get Version /value 2^>nul ^|find "="') do set %%c
- echo;!ProcessId!
- echo;!PathName!
- echo;!Version!
- echo;
- endlocal
- )
- pause
复制代码
结果贴出来看看
作者: pcl_test 时间: 2017-3-28 11:42
本帖最后由 pcl_test 于 2017-3-28 11:57 编辑
- (
- wmic process where "name='lmgrd.exe'" get ProcessId /value
- echo;
- wmic service where "PathName like '%%\\lmgrd.exe'" get Name,PathName,ProcessId /value
- )>tmp.txt
- pause
复制代码
将tmp.txt用网盘分享出来
作者: solan 时间: 2017-3-28 12:36
回复 35# pcl_test
47780
C:\ProgramData\nx4.0_flex\lmgrd.exe
11.6.1.0
29360
请按任意键继续. . .
作者: solan 时间: 2017-3-28 12:38
本帖最后由 pcl_test 于 2017-3-28 19:04 编辑
回复 36# pcl_test
ProcessId=47780
ProcessId=29360
Name=NX4.0
PathName=C:\ProgramData\nx4.0_flex\lmgrd.exe
ProcessId=47780
作者: pcl_test 时间: 2017-3-28 13:23
回复 38# solan
36楼改下%%\\lmgrd.exe%%
重新运行看看结果
作者: solan 时间: 2017-3-28 13:39
本帖最后由 pcl_test 于 2017-3-28 19:04 编辑
回复 39# pcl_test
ProcessId=47780
ProcessId=29360
Name=nx11
PathName="C:\Users\Administrator\Desktop\nx_flex\lmgrd.exe"
ProcessId=0
Name=NX4.0
PathName=C:\ProgramData\nx4.0_flex\lmgrd.exe
ProcessId=47780
Name=nx11.0
PathName="C:\Users\Administrator\Desktop\nx_flex\lmgrd.exe"
ProcessId=0
作者: pcl_test 时间: 2017-3-28 13:52
本帖最后由 pcl_test 于 2017-3-29 05:07 编辑
版本获取没问题,但进程和服务的ProcessId能对上的只有一个- @echo off
- for /f "delims=" %%a in ('wmic service where "PathName like '%%\\lmgrd.exe%%'" get PathName /value 2^>nul ^|find "="') do (
- setlocal enabledelayedexpansion
- set %%a
- set PathName=!PathName:"=!
- echo;!PathName!
- for /f %%c in ('wmic datafile where "Name='!PathName:\=\\!'" get Version /value 2^>nul ^|find "="') do set %%c
- for /f "tokens=1-4 delims=." %%d in ("!Version!.0.0") do (
- set /a #a=%%d+100000000,#b=%%e+100000000,#c=%%f+100000000,#d=%%g+100000000
- if "!#a!.!#b!.!#c!.!#d!" leq "100000011.100000006.100000001.100000000" (
- echo;11.6.1.0 ^>= !Version!
- ) else echo;11.6.1.0 ^< !Version!
- )
- echo;
- endlocal
- )
- pause
复制代码
作者: solan 时间: 2017-3-28 14:12
本帖最后由 solan 于 2017-3-28 14:15 编辑
回复 41# pcl_test
我这些服务,每个服务一开启就会有2个同名进程
你们的代码我一点不懂啊,好难啊
作者: solan 时间: 2017-3-28 14:21
如果11.6.1.0版本的lmgrd.exe进程存在,我就保留,比他版本高的同名进程如果有的话全部结束
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |