[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

本帖最后由 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已修改,小改一下,试试能不能行
bat小白,请多指教!谢谢!

TOP

本帖最后由 iii888iii 于 2023-1-17 15:41 编辑

修改的我测试了....

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

但是,只有单纯的,1-120的机器却不执行.

TOP

我的问题,漏了一个环境:
排除掉不是:1-120,,这120个编号的虚拟机.

TOP

测试,关掉.无关虚拟机后,成功了.

TOP

真不好意思.实际环境太复杂,我想了一天了.这个逻辑,这个代码是可以实现功能了.

就差一个,排除,1-120号虚拟机的代码

TOP

d:\192.168.a\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)
d:\192.168.b\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)

名称不确定,是哪里不确定呢,哪里又是确定的呢?你得自己总结下规律,不然没法排除
bat小白,请多指教!谢谢!

TOP

反过来说.
1-120个编号的,是确定的.

这个不确定的特征.,文件夹有  2个点吧.

TOP

对,
192.168.1.vmx   这个名称长度可以确定,超过3个字符

TOP

120 编号的虚拟机..  字符长度,不超过3个字符

TOP

本帖最后由 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. )
复制代码

TOP

回复 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
复制代码
把以上代码放到你需要的地方后根据实际情况稍做修改即可

TOP

回复 11# terse


    vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$
这句过滤不来

TOP

回复 13# iii888iii


    单独执行这一句的话,需要把^去掉。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# iii888iii
vmrun list 命令结果是不是一楼所示 还有没有其他信息
另外[0-9]*[0-9]*[0-9]*匹配去掉最后一个*,  [0-9]*[0-9]*[0-9]即可

TOP

返回列表