标题: [其他] 批处理按逻辑关闭指定的虚拟机,搞不来,求大神赐教. [打印本页]
作者: iii888iii 时间: 2023-1-12 14:40 标题: 批处理按逻辑关闭指定的虚拟机,搞不来,求大神赐教.
本帖最后由 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不是编号的虚拟机一直挂机的.
作者: 77七 时间: 2023-1-12 16:41
- @echo off
- setlocal enabledelayedexpansion
- cd /d "D:\VMware\"
- for /f "tokens=4 delims=\." %%a in ('vmrun list ^| find vmx') do (
- set _"%%a"=ture
- )
-
- for /l %%i in (1,5,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
- )
- )
- )
- )
- )
- )
- endlocal
- pause
- exit
复制代码
试试能行不,我是新手,不会写,如果不行,等大神帮你写
作者: iii888iii 时间: 2023-1-12 17:26
回复 2# 77七
感谢不尽, 我测试一下.能写这样就不错了.
作者: iii888iii 时间: 2023-1-12 17:47
回复 2# 77七
Find
参数不正确
有点问题..然后,有关闭虚拟机的动作,但是关闭失败.
作者: iii888iii 时间: 2023-1-12 17:48
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
请按任意键继续. . .
作者: 77七 时间: 2023-1-12 17:55
本帖最后由 77七 于 2023-1-12 18:04 编辑
回复 5# iii888iii
%%c是否正确显示需要关闭的虚拟机?
是不是不能同时存在两个关闭虚拟器任务?关闭一个虚拟机要多久呢?试下楼下代码正确吗,能不能正确关闭,我暂时加了暂停,观察一下需要多久能成功关闭一个虚拟机,然后改成延时就行了
作者: 77七 时间: 2023-1-12 17:58
- @echo off
- setlocal enabledelayedexpansion
- cd /d "D:\VMware\"
- for /f "tokens=4 delims=\." %%a in ('vmrun list ^| findstr vmx') do (
- set _"%%a"=ture
- )
-
- for /l %%i in (1,5,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
- echo 确认关闭后按任意键继续
- pause
- )
- )
- )
- )
- )
- )
- endlocal
- pause
- exit
复制代码
回复 5# iii888iii
作者: iii888iii 时间: 2023-1-12 19:45
成功了,关机后面,增加延时5秒,这个动作需要延时才正常
谢谢你,祝生活顺利.
作者: terse 时间: 2023-1-12 19:48
- @echo off
- setlocal enabledelayedexpansion
- cd /d "D:\VMware\"
- for /f "delims=" %%i in ('vmrun list ^| findstr /i vmx') do (
- if defined n (
- if !m! neq %%~ni (
- if !num! lss 5 (
- set /a m-=1
- for /l %%l in (!n!,1,!m!) do vmrun stop "D:\vos\%%l\%%l.vmx" hard
- )
- set /a num=1,n=%%~ni,m=n+1
- ) else set /a num+=1,m+=1
- ) else set /a num=1,n=%%~ni,m=n+1
- )
- if !num! lss 5 (
- set /a m-=1
- for /l %%l in (!n!,1,!m!) do vmrun stop "D:\vos\%%l\%%l.vmx" hard
- )
- pause
复制代码
作者: iii888iii 时间: 2023-1-12 20:15
回复 7# 77七
可能有点瑕疵,
我看这句,for %%c in (!num1! !num2! !num3! !num4! !num5!) do (
是没问题.
但是,6,7,8,9,10,这个也算是一组
运行测试,老是提示关闭了6.vmx
作者: 77七 时间: 2023-1-12 20:39
回复 10# iii888iii
你是不是代码复制错了?重新复制下代码试试或者执行下面代码,把txt里的内容全部发上来看看,可能有的地方需要排除一下?
复制代码
我这样测试了一下,没发现问题
- @echo off
- setlocal enabledelayedexpansion
- set _"1"=ture
- set _"2"=ture
- set _"3"=ture
- set _"4"=ture
- rem set _"5"=ture
- set _"6"=ture
- set _"7"=ture
- set _"8"=ture
- set _"9"=ture
- set _"10"=ture
- rem set _"11"=ture
- set _"12"=ture
-
-
- for /l %%i in (1,5,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" (
- rem vmrun stop "D:\vos\%%c\%%c.vmx" hard
- echo 关闭了虚拟机,编号%%c
- echo 确认关闭后按任意键继续
- pause
- )
- )
- )
- )
- )
- )
- endlocal
- pause
- exit
复制代码
作者: iii888iii 时间: 2023-1-12 21:42
本帖最后由 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不是编号的虚拟机一直挂机的.
作者: 77七 时间: 2023-1-12 22:05
回复 12# iii888iii
如果需要补充或更正,请在顶楼一次性编辑完整,切勿挤牙膏...顶楼只举一个特例,你觉得合适吗
作者: iii888iii 时间: 2023-1-12 23:32
回复 13# 77七
很抱歉,当时没考虑到,并非有意为之
作者: 77七 时间: 2023-1-13 01:03
本帖最后由 77七 于 2023-1-13 01:14 编辑
- 1,2,3,4,5,6,7,8,9,10,11,12,14
- 1,3,4,5,6,7,8,9,10,11,12
- 3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21
复制代码
像这样,需要哪些关机呢
作者: iii888iii 时间: 2023-1-13 11:42
01, 非整组是,11,12,14, 但是是最大序号的5个虚拟机,不关机.
02. 非整组是 1,3,4,5, 和11, 12 其中,1,3,4,5,不是最大序号的5个虚拟机.关闭.
03. 3,4,5, 和 11,13,14,15, 和 21 非整组3组. 3.4.5 11.13.14.15.关机 21,包含在最大序号5个之中.不操作.
麻烦您了
作者: 77七 时间: 2023-1-13 12:53
本帖最后由 77七 于 2023-1-13 15:00 编辑
回复 16# iii888iii
- @echo off
- setlocal enabledelayedexpansion
- cd /d "D:\VMware\"
- set /a n=0
- for /f "tokens=4 delims=\." %%a in ('vmrun list ^| findstr vmx') do (
- echo %%a|findstr "[0-9]" && (
- set _"%%a"=ture
- set max1=%%a
- set /a n=n+1
- )
- ) >nul
- if %n% lss 10 ((echo 当前数字编号虚拟器开机数量:%n%) & pause & exit )
- set /a max2=max1%%5
- if %max2% equ 0 ( set /a "max3=max1-5" ) else ( set /a "max3=max1-max2" )
-
- for /l %%i in (1,5,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" (
- if %%c leq %max3% (
- vmrun stop "D:\vos\%%c\%%c.vmx" hard
- timeout 5
- echo 关闭了虚拟机,编号%%c
- )
- )
- )
- )
- )
- )
- )
- endlocal
- pause
- exit
复制代码
1456,修改,添加了第四行。试试这样行不
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |