首先我们来说说需求:某个用户创建了一些虚拟机,我们通过Get-SCIPAddress是可以得到特定名称的虚拟机,但是,如果我们希望从某个描述来批量获得虚拟机的IP,这个时候通过“管道”和“直接的命令”是无法获取的。
这个时候,就需要用到循环。
比如下面这个例子,虚拟机的get-vm所获得的描述部分,最下面这些“xxxx新机器到位后要求16G这些字符”,而使用Get-SCIPAddress的描述部分则是get-vm的名称部分。所以我们这里需要用到一个相同的属性,那就是get-vm的名称部分,和Get-SCIPAddress的描述部分。通过两个命令连查,得到结果。
废话不多说,直接上脚本
1
2
3
4
5
6
7
8
9
10
11
|
Import-Module
virtualmachinemanager
$vvm
=
Get-SCIPAddress
|where
{
$_
.Description
-like
"边塞之城*"
}
|select
name,Description
$vcb
=
get-vm
|where
{
$_
.Description
-like
"*李寻欢*"
}
|select
Name
foreach
(
$cb
in
$vvm
)
{
foreach
(
$ccb
in
$vcb
)
{
if
(
$cb
.description
-eq
$ccb
.name)
{echo
$cb
}
}
}
|
实际上面的脚本做的工作稍显复杂,它首先使用Get-SCIPAddress where选择了一下,描述部分有类似边塞之城的属性,接下来在get-vm的描述部分,搜索一下具有名称李寻欢的部分
接下来进入一个循环,查找两个命令中描述和名称相同的部分,然后打印出来。通过两个嵌套循环实现。
事实上,以上的foreach语句可以用更简单的语句来实现
1
2
3
|
foreach
(
$cb
in
$vvm
)
{
if
(
$_
.cb.description
-eq
$_
.ccb.name)
{echo
$cb
}}
|
这里其实就是通过了$_.函数的方法缩减了输入的字符,两种方法前面的更便于阅读,第二种在熟练的前提下,也更简洁。
本文转自 九叔 51CTO博客,原文链接:http://blog.51cto.com/jiushu/1662030,如需转载请自行联系原作者