Board logo

标题: [系统相关] 【已解决】批处理对多个同名不同版本的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

  1. 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 编辑
  1. @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

不行啊,我写不出来
  1. @echo off
  2. set w=wmic process where "name='lmgrd.exe'" get executablepath
  3. for /f "tokens=*" %%a in ('%w% 2^>nul ^| find "\"') do set "ph=%%~dpa"
  4. wmic "%ph%lmgrd.exe"
  5. pause
复制代码

作者: solan    时间: 2017-3-27 14:22

请版主老大帮忙啊
作者: Nsqs    时间: 2017-3-27 15:22

回复 12# solan
  1. @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

  1. @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()"
复制代码
我这里记事本也是正常的,不知道你的是怎么回事你可以用下面代码看看路径有没有错
  1. @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

试试这样能否获取到你需要的版本号
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('wmic process where "name='QQ.exe'" get executablepath /value ^| findstr "="') do (
  3.     set "FullPath=%%i"
  4. )
  5. set "FullPath=%FullPath:\=\\%"
  6. wmic datafile where "Name='%FullPath%'" get Version /value
  7. pause
复制代码

作者: pcl_test    时间: 2017-3-28 06:08

  1. wmic process where "name='lmgrd.exe'" get executablepath,processid>result.txt
  2. 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
  1. (
  2.     wmic process where "name='lmgrd.exe'" get *
  3.     echo;==============
  4.     wmic service get *
  5. )>result.txt
  6. 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 编辑
  1. @echo off
  2. for /f %%a in ('wmic process where "name='lmgrd.exe'" get ProcessId /value 2^>nul ^|find "="') do (
  3.     setlocal enabledelayedexpansion
  4.     set %%a
  5.     for /f "delims=" %%b in ('wmic service where "ProcessId='!ProcessId!'" get PathName /value 2^>nul ^|find "="') do set %%b
  6.     for /f  %%c in ('wmic datafile where "Name='!PathName:\=\\!'" get Version /value 2^>nul ^|find "="') do set %%c
  7.     echo;!ProcessId!
  8.     echo;!PathName!
  9.     echo;!Version!
  10.     echo;
  11.     endlocal
  12. )
  13. pause
复制代码
结果贴出来看看
作者: pcl_test    时间: 2017-3-28 11:42

本帖最后由 pcl_test 于 2017-3-28 11:57 编辑
  1. (
  2.     wmic process where "name='lmgrd.exe'" get ProcessId /value
  3.     echo;
  4.     wmic service where "PathName like '%%\\lmgrd.exe'" get Name,PathName,ProcessId /value
  5. )>tmp.txt
  6. 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能对上的只有一个
  1. @echo off
  2. for /f "delims=" %%a in ('wmic service where "PathName like '%%\\lmgrd.exe%%'" get PathName /value 2^>nul ^|find "="') do (
  3.     setlocal enabledelayedexpansion
  4.     set %%a
  5.     set PathName=!PathName:"=!
  6.     echo;!PathName!
  7.     for /f %%c in ('wmic datafile where "Name='!PathName:\=\\!'" get Version /value 2^>nul ^|find "="') do set %%c
  8.     for /f "tokens=1-4 delims=." %%d in ("!Version!.0.0") do (
  9.         set /a #a=%%d+100000000,#b=%%e+100000000,#c=%%f+100000000,#d=%%g+100000000
  10.         if "!#a!.!#b!.!#c!.!#d!" leq "100000011.100000006.100000001.100000000" (
  11.             echo;11.6.1.0 ^>= !Version!
  12.         ) else echo;11.6.1.0 ^< !Version!
  13.     )  
  14.     echo;
  15.     endlocal
  16. )
  17. 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://bathome.net./) Powered by Discuz! 7.2