标题: [其他] 求批处理根据指定规则关闭虚拟机 [打印本页]
作者: iii888iii 时间: 2023-1-16 20:49 标题: 求批处理根据指定规则关闭虚拟机
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-16 21:21
本帖最后由 77七 于 2023-1-17 00:15 编辑
- @echo off
- setlocal enabledelayedexpansion
- cd /d "D:\VMware\"
- set /a n=0
- for /f "tokens=2,4 delims=\." %%a in ('vmrun list ^| findstr vmx') do (
- if /i "%%a" equ "vos" (
- set /a n=n+1
- if !n! equ 1 (
- set firstNum=%%b
- )
- if !n! equ 5 (
- set fifthNum=%%b
- )
- )
- )
- if not defined fifthNum (
- goto :eof
- )
- set /a m=%fifthNum%%%5
- if %m% neq 0 (
- vmrun stop "D:\vos\%firstNum%\%firstNum%.vmx" hard
- ping 127.0.0.1 -n 6 >nul
- )
- endlocal
- exit
复制代码
00:15已修改,小改一下,试试能不能行
作者: iii888iii 时间: 2023-1-16 22:38
本帖最后由 iii888iii 于 2023-1-17 15:41 编辑
修改的我测试了....
有多余的不确定名称的机器.可以成功执行.
但是,只有单纯的,1-120的机器却不执行.
作者: iii888iii 时间: 2023-1-16 22:45
我的问题,漏了一个环境:
排除掉不是:1-120,,这120个编号的虚拟机.
作者: iii888iii 时间: 2023-1-16 22:48
测试,关掉.无关虚拟机后,成功了.
作者: iii888iii 时间: 2023-1-16 22:49
真不好意思.实际环境太复杂,我想了一天了.这个逻辑,这个代码是可以实现功能了.
就差一个,排除,1-120号虚拟机的代码
作者: 77七 时间: 2023-1-16 23:13
d:\192.168.a\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)
d:\192.168.b\192.168.1.vmx(非120个编号虚拟机,要排除,名称不确定)
名称不确定,是哪里不确定呢,哪里又是确定的呢?你得自己总结下规律,不然没法排除
作者: iii888iii 时间: 2023-1-16 23:28
反过来说.
1-120个编号的,是确定的.
这个不确定的特征.,文件夹有 2个点吧.
作者: iii888iii 时间: 2023-1-16 23:29
对,
192.168.1.vmx 这个名称长度可以确定,超过3个字符
作者: iii888iii 时间: 2023-1-16 23:29
120 编号的虚拟机.. 字符长度,不超过3个字符
作者: terse 时间: 2023-1-17 04:29
本帖最后由 terse 于 2023-1-17 06:17 编辑
可以判断%%~na是否长度大于6
要不换下面试试- vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$
复制代码
试一下可行的话 去掉ECHO- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$') do (
- if defined n (
- set /a n+=1,m=%%~ni%%5
- if !n! equ 5 if !m! neq 0 (
- echo vmrun stop "!file!" hard
- ping 127.0.0.1 -n 6 >nul
- exit
- )
- ) else set /a n=1&set "file=%%i"
- )
复制代码
作者: hfxiang 时间: 2023-1-17 10:16
回复 6# iii888iii
看到问题已基本解决 ,俺给解决个局部问题 ,过滤掉1-120号虚拟机外的数据,可用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )- 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
复制代码
把以上代码放到你需要的地方后根据实际情况稍做修改即可
作者: iii888iii 时间: 2023-1-17 10:20
回复 11# terse
vmrun list ^| findstr \\[0-9]*[0-9]*[0-9]*\.vmx$
这句过滤不来
作者: Batcher 时间: 2023-1-17 11:14
回复 13# iii888iii
单独执行这一句的话,需要把^去掉。
作者: terse 时间: 2023-1-17 12:01
回复 13# iii888iii
vmrun list 命令结果是不是一楼所示 还有没有其他信息
另外[0-9]*[0-9]*[0-9]*匹配去掉最后一个*, [0-9]*[0-9]*[0-9]即可
作者: qixiaobin0715 时间: 2023-1-17 12:16
本帖最后由 qixiaobin0715 于 2023-1-17 16:33 编辑
如果非要用findstr过滤,这样可准确表达1-120:- findstr /e "\\[1-9]\.vmx \\[1-9][0-9]\.vmx \\1[0-1][0-9]\.vmx \\120\.vmx"
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |