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

[其他] 批处理按逻辑关闭指定的虚拟机,搞不来,求大神赐教.

本帖最后由 iii888iii 于 2023-1-12 23:33 编辑

现在有下面bat命令行控制VMware虚拟机关闭指定虚拟机的代码.
这里有个逻辑写不出,请大神帮忙.

情况是这样的.
1,首先运行:  
d:
cd D:\VMware\
vmrun list
可以得到所有开机的虚拟机的列表名称.
得到结论(举例):
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
2, 逻辑: 如果不是整组的开机虚拟机,则关闭.

例如:
D:\vos\14\14.vmx
D:\vos\15\15.vmx

如果,不是整组虚拟机存在.,那么,
关机:
D:\vos\14\14.vmx
D:\vos\15\15.vmx

关机代码:
vmrun stop "D:\vos\14\14.vmx" hard
vmrun stop "D:\vos\15\15.vmx" hard
组概念:
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\6\6.vmx
D:\vos\7\7.vmx
D:\vos\8\8.vmx
D:\vos\9\9.vmx
D:\vos\10\10.vmx  为整组

其余类推,虚拟机最大编号120,按顺序,每5个编号连续的,为一组.


d:
cd D:\VMware\
vmrun list
关机代码:
vmrun stop "D:\vos\2\2.vmx" hard
vmrun stop "D:\vos\3\3.vmx" hard


当总共10个编号的虚拟机开机,才会运行这个代码,然后,如果中间有一个虚拟机需要关机,那么,后面的虚拟机开起来,就肯定也不是整组的,但是这组是不关机的(最大编号的5个不关机)

1,21,22,23,24,25,26,27,28,29

总共开启了10个,然后就运行这个代码,这个时候   1,不是整组,

26,27,28,29,也不是整,组,   但是这个不是整组,是应为1,不是整组,导致的,所以,最大序号的5个虚拟机不关机.

只,关闭,1,这个零散的虚拟机.这个逻辑才可以.
另外就是需要操作的虚拟机,限制编号必须为1-120的数字.  因为有2不是编号的虚拟机一直挂机的.

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "D:\VMware\"
  4. for /f "tokens=4 delims=\." %%a in ('vmrun list ^| find vmx') do (
  5. set _"%%a"=ture
  6. )
  7. for /l %%i in (1,5,120) do (
  8. set num=%%i
  9. set /a m=1
  10. set /a num1=num,num2=num+1,num3=num+2,num4=num+3,num5=num+4
  11. for %%b in (!num1! !num2! !num3! !num4! !num5!) do (
  12. if not defined _"%%b" (
  13. if !m! equ 1 (
  14. set /a m=2
  15. for %%c in (!num1! !num2! !num3! !num4! !num5!) do (
  16. if defined _"%%c" (
  17. vmrun stop "D:\vos\%%c\%%c.vmx" hard
  18. echo 关闭了虚拟机,编号%%c
  19. )
  20. )
  21. )
  22. )
  23. )
  24. )
  25. endlocal
  26. pause
  27. exit
复制代码

试试能行不,我是新手,不会写,如果不行,等大神帮你写
bat小白,请多指教!谢谢!

TOP

回复 2# 77七




    感谢不尽, 我测试一下.能写这样就不错了.

TOP

回复 2# 77七


    Find
参数不正确

有点问题..然后,有关闭虚拟机的动作,但是关闭失败.

TOP

C:\Users\Administrator\Desktop>rem @echo off

C:\Users\Administrator\Desktop>setlocal enabledelayedexpansion

C:\Users\Administrator\Desktop>cd /d "D:\VMware\"

D:\vmware>for /F "tokens=4 delims=\." %a in ('vmrun list | find vmx') do (set _"
%a"=ture )
FIND: 参数格式不正确

D:\vmware>for /L %i in (1 120) do (
set num=%i
set /a m=1
set /a num1=num,num2=num+1,num3=num+2,num4=num+3,num5=num+4
for %b in (!num1! !num2! !num3! !num4! !num5!) do (if not defined _"%b" (if !m!
EQU 1 (
set /a m=2
for %c in (!num1! !num2! !num3! !num4! !num5!) do (if defined _"%c" (
vmrun stop "D:\vos\%c\%c.vmx" hard
echo 关闭了虚拟机,编号%c
) )
) ) )
)

D:\vmware>endlocal

C:\Users\Administrator\Desktop>pause
请按任意键继续. . .

TOP

本帖最后由 77七 于 2023-1-12 18:04 编辑

回复 5# iii888iii
%%c是否正确显示需要关闭的虚拟机?
是不是不能同时存在两个关闭虚拟器任务?关闭一个虚拟机要多久呢?试下楼下代码正确吗,能不能正确关闭,我暂时加了暂停,观察一下需要多久能成功关闭一个虚拟机,然后改成延时就行了
bat小白,请多指教!谢谢!

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "D:\VMware\"
  4. for /f "tokens=4 delims=\." %%a in ('vmrun list ^| findstr vmx') do (
  5. set _"%%a"=ture
  6. )
  7. for /l %%i in (1,5,120) do (
  8. set num=%%i
  9. set /a m=1
  10. set /a num1=num,num2=num+1,num3=num+2,num4=num+3,num5=num+4
  11. for %%b in (!num1! !num2! !num3! !num4! !num5!) do (
  12. if not defined _"%%b" (
  13. if !m! equ 1 (
  14. set /a m=2
  15. for %%c in (!num1! !num2! !num3! !num4! !num5!) do (
  16. if defined _"%%c" (
  17. vmrun stop "D:\vos\%%c\%%c.vmx" hard
  18. echo 关闭了虚拟机,编号%%c
  19. echo 确认关闭后按任意键继续
  20. pause
  21. )
  22. )
  23. )
  24. )
  25. )
  26. )
  27. endlocal
  28. pause
  29. exit
复制代码
回复 5# iii888iii
bat小白,请多指教!谢谢!

TOP

成功了,关机后面,增加延时5秒,这个动作需要延时才正常
谢谢你,祝生活顺利.

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "D:\VMware\"
  4. for /f "delims=" %%i in ('vmrun list ^| findstr /i vmx') do (
  5.        if defined n (
  6.                if !m! neq %%~ni (
  7.                        if !num! lss 5 (
  8.                              set /a m-=1
  9.                              for /l %%l in (!n!,1,!m!) do vmrun stop "D:\vos\%%l\%%l.vmx" hard
  10.                        )
  11.                        set /a num=1,n=%%~ni,m=n+1
  12.                ) else set /a num+=1,m+=1
  13.        ) else set /a num=1,n=%%~ni,m=n+1
  14. )
  15. if !num! lss 5 (
  16.       set /a m-=1
  17.       for /l %%l in (!n!,1,!m!) do vmrun stop "D:\vos\%%l\%%l.vmx" hard
  18. )
  19. pause
复制代码

TOP

回复 7# 77七


    可能有点瑕疵,

我看这句,for %%c in (!num1! !num2! !num3! !num4! !num5!) do (

是没问题.

但是,6,7,8,9,10,这个也算是一组

运行测试,老是提示关闭了6.vmx

TOP

回复 10# iii888iii

你是不是代码复制错了?重新复制下代码试试或者执行下面代码,把txt里的内容全部发上来看看,可能有的地方需要排除一下?
  1. vmrun list >>1.txt
复制代码

我这样测试了一下,没发现问题
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set _"1"=ture
  4. set _"2"=ture
  5. set _"3"=ture
  6. set _"4"=ture
  7. rem set _"5"=ture
  8. set _"6"=ture
  9. set _"7"=ture
  10. set _"8"=ture
  11. set _"9"=ture
  12. set _"10"=ture
  13. rem set _"11"=ture
  14. set _"12"=ture
  15. for /l %%i in (1,5,120) do (
  16. set num=%%i
  17. set /a m=1
  18. set /a num1=num,num2=num+1,num3=num+2,num4=num+3,num5=num+4
  19. for %%b in (!num1! !num2! !num3! !num4! !num5!) do (
  20. if not defined _"%%b" (
  21. if !m! equ 1 (
  22. set /a m=2
  23. for %%c in (!num1! !num2! !num3! !num4! !num5!) do (
  24. if defined _"%%c" (
  25. rem vmrun stop "D:\vos\%%c\%%c.vmx" hard
  26. echo 关闭了虚拟机,编号%%c
  27. echo 确认关闭后按任意键继续
  28. pause
  29. )
  30. )
  31. )
  32. )
  33. )
  34. )
  35. endlocal
  36. pause
  37. exit
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 iii888iii 于 2023-1-12 21:45 编辑

列表导不出来,
其实导出来也就是必须要操作的虚拟机:1-120,共120个虚拟机
虚拟机名称就是这个编号.

实际挂机发现,会出另外一个极端问题.就是,最大值的5个虚拟机,不执行.
当总共10个编号的虚拟机开机,才会运行这个代码,然后,如果中间有一个虚拟机需要关机,那么,后面的虚拟机开起来,就肯定也不是整组的,但是这组是不关机的(最大编号的5个不关机)

1,21,22,23,24,25,26,27,28,29

总共开启了10个,然后就运行这个代码,这个时候   1,不是整组,

26,27,28,29,也不是整,组,   但是这个不是整组,是应为1,不是整组,导致的,所以,最大序号的5个虚拟机不关机.

只,关闭,1,这个零散的虚拟机.这个逻辑才可以.
另外就是需要操作的虚拟机,限制编号必须为1-120的数字.  因为有2不是编号的虚拟机一直挂机的.

TOP

回复 12# iii888iii

如果需要补充或更正,请在顶楼一次性编辑完整,切勿挤牙膏...顶楼只举一个特例,你觉得合适吗
bat小白,请多指教!谢谢!

TOP

回复 13# 77七


   很抱歉,当时没考虑到,并非有意为之

TOP

本帖最后由 77七 于 2023-1-13 01:14 编辑
  1. 1,2,3,4,5,6,7,8,9,10,11,12,14
  2. 1,3,4,5,6,7,8,9,10,11,12
  3. 3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21
复制代码

像这样,需要哪些关机呢
bat小白,请多指教!谢谢!

TOP

返回列表