官术网_书友最值得收藏!

Extending PowerCLI objects with the New-VIProperty cmdlet

Sometimes you can have the feeling that a PowerCLI object is missing a property. Although the VMware PowerCLI team tried to include the most useful properties in the objects, you can have the need for an extra property. Luckily, PowerCLI has a way to extend a PowerCLI object using the New-VIProperty cmdlet. This cmdlet has the following syntax:

New-VIProperty [-Name] <String> [-ObjectType] <String[]> [-Value] <ScriptBlock> [-Force] [-BasedOnExtensionProperty <String[]>] [-WhatIf] [-Confirm][<CommonParameters>]
New-VIProperty [-Name] <String> [-ObjectType] <String[]> [-Force] [-ValueFromExtensionProperty] <String> [-WhatIf] [-Confirm] [<CommonParameters>]

Let's start with an example. You will add the VMware Tools' running statuses used in a previous example to the VirtualMachineImpl object using the New-VIProperty cmdlet:

PowerCLI C:\> New-VIProperty -ObjectType VirtualMachine -Name ToolsRunningStatus -ValueFromExtensionProperty 'Guest.ToolsRunningStatus'

Name RetrievingType DeclaringType Value
---- -------------- ------------- -----
ToolsRunning... VirtualMachine VirtualMachine Guest.ToolsRunningStatus

Now you can get the tools' running statuses of all of your virtual machines with:

PowerCLI C:\> Get-VM | Select-Object -Property Name, ToolsRunningStatus

Isn't this much easier?

In the next example, you will add the vCenterServer property to the VirtualMachineImpl object. The name of the vCenter Server is part of the VirtualMachineImpl Uid property. The Uid property is a string that looks like /VIServer=domain\account@vCenter:443/VirtualMachine=VirtualMachine-vm-239/

You can use the Split() method to split the string. For example, the following command splits the string 192.168.0.1 into an array with four elements:

PowerCLI C:\> "192.168.0.1".Split('.')
192
168
0
1

The first element is 192, the second element 168, the third element 0, and the fourth and last element 1. If you assign the array to a variable then you can use an index to specify a certain element of the array:

PowerCLI C:\> $Array = "192.168.0.1".Split('.')

The index is 0 for the first element, 1 for the second element, and so on. If you want to specify the last element of the array, you can use the index -1. For example:

PowerCLI C:\> $Array[0]
192

In the Uid property, the name of the vCenter Server is between the @ sign and the colon. So you can use those two characters to split the string. First you split the string at the colon and take the part before the colon. That is the first element of the resulting array:

PowerCLI C:\> $Uid = '/VIServer=domain\account@vCenter:443/VirtualMachine=VirtualMachine-vm-239/'
PowerCLI C:\> $Uid.Split(':')[0]
/VIServer=domain\account@vCenter

Split the resulting part at the @ sign and take the second element of the resulting array to get the name of the vCenter Server:

PowerCLI C:\> $String = '/VIServer=domain\account@vCenter'
PowerCLI C:\> $String.Split('@')[1]
vCenter

You can do this splitting with one line of code:

PowerCLI C:\> $Uid = '/VIServer=domain\account@vCenter:443/VirtualMachine=VirtualMachine-vm-239/'
PowerCLI C:\> $Uid.Split(':')[0].Split('@')[1]
vCenter

Use the –Value parameter of the New-VIProperty cmdlet to specify a scriptblock. In this scriptblock, $Args[0] is the object with which you want to retrieve the name of the vCenter Server:

PowerCLI C:\> New-VIProperty -Name vCenterServer -ObjectType VirtualMachine -Value {$Args[0].Uid.Split(":")[0].Split("@")[1]} –Force

The New-VIProperty –Force parameter indicates that you want to create the new property even if another property with the same name already exists for the specified object type.

Now you can get a list of all of your virtual machines and their vCenter Servers with:

PowerCLI C:\> Get-VM | Select-Object -Property Name,vCenterServer
主站蜘蛛池模板: 广西| 望城县| 贞丰县| 信阳市| 岳西县| 德安县| 克东县| 安国市| 东光县| 南郑县| 邓州市| 宣化县| 万州区| 阿拉善盟| 文山县| 涪陵区| 长子县| 临夏县| 老河口市| 稻城县| 左贡县| 新田县| 沙田区| 清远市| 凉城县| 平山县| 石泉县| 洮南市| 香格里拉县| 四会市| 琼海市| 松滋市| 工布江达县| 汾西县| 额济纳旗| 随州市| 大方县| 于田县| 阳曲县| 金华市| 安达市|