找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 47380|回复: 15

[其他] 求批处理根据指定规则关闭虚拟机

[复制链接]
发表于 2023-1-16 20:49:43 | 显示全部楼层 |阅读模式
1,首先运行:  
d:
cd D:\VMware\
vmrun list
排除掉不是:1-120,,这120个编号的虚拟机.


可以得到所有开机的虚拟机的列表名称.
得到结论(举例):
d:\192.168.a\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定,名称可以确定长度超过3个字符192.168.vmx)
d:\192.168.b\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定,名称可以确定长度超过3个字符192.168.vmx)
D:\vos\1\1.vmx
D:\vos\2\2.vmx
D:\vos\3\3.vmx
D:\vos\4\4.vmx
D:\vos\5\5.vmx
D:\vos\14\14.vmx
D:\vos\15\15.vmx

提取判断:最小的5个结论
D:\vos\1\1.vmx
D:\vos\2\2.vmx
D:\vos\3\3.vmx
D:\vos\4\4.vmx
D:\vos\5\5.vmx

判断,倒数第5个的编号,是否被5整除
D:\vos\5\5.vmx
提取得到:5
5除以5=1,可以被整除. 无操作.
exit
--------------------------------------案例2
D:\vos\1\1.vmx
D:\vos\2\2.vmx
D:\vos\3\3.vmx
D:\vos\5\5.vmx
D:\vos\14\14.vmx
D:\vos\15\15.vmx
提取判断:最小的5个结论
D:\vos\1\1.vmx
D:\vos\2\2.vmx
D:\vos\3\3.vmx
D:\vos\5\5.vmx
D:\vos\14\14.vmx

判断,倒数第5个的编号,是否被5整除
D:\vos\14\14.vmx
提取得到:14
14除以5=1,不能被整除.

执行:  关闭,最小编号虚拟机(D:\vos\1\1.vmx)

vmrun stop "D:\vos\1\1.vmx" hard

延时6秒:
ping 127.0.0.1 -n 6 >nul

exit


--------------------------------------案例3
D:\vos\1\13.vmx
D:\vos\2\14.vmx
D:\vos\3\15.vmx
D:\vos\5\16.vmx
D:\vos\14\17.vmx
D:\vos\15\18.vmx
D:\vos\15\19.vmx
D:\vos\15\20.vmx

提取判断:最小的5个结论
D:\vos\1\13.vmx
D:\vos\2\14.vmx
D:\vos\3\15.vmx
D:\vos\5\16.vmx

D:\vos\17\17.vmx

判断,倒数第5个的编号,是否被5整除
D:\vos\17\17.vmx
提取得到:17
17除以5=1,不能被整除.

执行:  关闭,最小编号虚拟机(D:\vos\13\13.vmx)

vmrun stop "D:\vos\13\13.vmx" hard

延时6秒:
ping 127.0.0.1 -n 6 >nul

exit
发表于 2023-1-16 21:21:27 | 显示全部楼层
本帖最后由 77七 于 2023-1-17 00:15 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "D:\VMware"
  4. set /a n=0
  5. for /f "tokens=2,4 delims=\." %%a in ('vmrun list ^| findstr vmx') do (
  6.         if /i "%%a" equ "vos" (
  7.                 set /a n=n+1
  8.                 if !n! equ 1 (
  9.                         set firstNum=%%b
  10.                 )
  11.                 if !n! equ 5 (
  12.                         set fifthNum=%%b        
  13.                 )
  14.         )
  15. )
  16. if not defined fifthNum (
  17.         goto :eof
  18. )
  19. set /a m=%fifthNum%%%5
  20. if %m% neq 0 (
  21.         vmrun stop "D:\vos\%firstNum%\%firstNum%.vmx" hard
  22.         ping 127.0.0.1 -n 6 >nul
  23. )
  24. endlocal
  25. exit
复制代码
00:15已修改,小改一下,试试能不能行
 楼主| 发表于 2023-1-16 22:38:38 | 显示全部楼层
本帖最后由 iii888iii 于 2023-1-17 15:41 编辑

修改的我测试了....

有多余的不确定名称的机器.可以成功执行.

但是,只有单纯的,1-120的机器却不执行.
 楼主| 发表于 2023-1-16 22:45:55 | 显示全部楼层
我的问题,漏了一个环境:
排除掉不是:1-120,,这120个编号的虚拟机.
 楼主| 发表于 2023-1-16 22:48:35 | 显示全部楼层
测试,关掉.无关虚拟机后,成功了.
 楼主| 发表于 2023-1-16 22:49:46 | 显示全部楼层
真不好意思.实际环境太复杂,我想了一天了.这个逻辑,这个代码是可以实现功能了.

就差一个,排除,1-120号虚拟机的代码
发表于 2023-1-16 23:13:56 | 显示全部楼层
d:\192.168.a\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)
d:\192.168.b\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)

名称不确定,是哪里不确定呢,哪里又是确定的呢?你得自己总结下规律,不然没法排除
 楼主| 发表于 2023-1-16 23:28:51 | 显示全部楼层
反过来说.
1-120个编号的,是确定的.

这个不确定的特征.,文件夹有  2个点吧.
 楼主| 发表于 2023-1-16 23:29:35 | 显示全部楼层
对,
192.168.1.vmx   这个名称长度可以确定,超过3个字符
 楼主| 发表于 2023-1-16 23:29:56 | 显示全部楼层
120 编号的虚拟机..  字符长度,不超过3个字符
发表于 2023-1-17 04:29:55 | 显示全部楼层
本帖最后由 terse 于 2023-1-17 06:17 编辑

可以判断%%~na是否长度大于6
要不换下面试试
  1. vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$
复制代码
试一下可行的话 去掉ECHO
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$') do (
  3.        if defined n (
  4.           set /a n+=1,m=%%~ni%%5
  5.           if !n! equ 5 if !m! neq 0 (
  6.              echo vmrun stop "!file!" hard
  7.              ping 127.0.0.1 -n 6 >nul
  8.              exit
  9.           )
  10.        ) else set /a n=1&set "file=%%i"
  11. )
复制代码
发表于 2023-1-17 10:16:39 | 显示全部楼层
回复 6# iii888iii


看到问题已基本解决 ,俺给解决个局部问题 ,过滤掉1-120号虚拟机外的数据,可用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe

  1. for /f "tokens=*" %%a in ('vmrun.exe list^|gawk "/\.vmx$/{if(match($0,/^.+\\([0-9]{1,3})\.[vV][mM][xX]$/,arr))if((arr[1]+0>=1)&&(arr[1]+0<=120))print $0}"') do echo;%%a
复制代码
把以上代码放到你需要的地方后根据实际情况稍做修改即可
 楼主| 发表于 2023-1-17 10:20:10 | 显示全部楼层
回复 11# terse


    vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$
这句过滤不来
发表于 2023-1-17 11:14:22 | 显示全部楼层
回复 13# iii888iii


    单独执行这一句的话,需要把^去掉。
发表于 2023-1-17 12:01:19 | 显示全部楼层
回复 13# iii888iii
vmrun list 命令结果是不是一楼所示 还有没有其他信息
另外[0-9]*[0-9]*[0-9]*匹配去掉最后一个*,  [0-9]*[0-9]*[0-9]即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 06:17 , Processed in 0.020350 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表