SCVMM的模板也会给Windows Azure Pack使用,这个时候如果手头有很多很多的节点需要导入导出,会是非常麻烦的一个事情,手动改的工作量很大。

比如说下面这张图,一个vhdx文件包含至少有名称、系列、版本、操作系统、以及本来路径的名字,另外如果是给Windows Azure Pack使用,可能还包含一个tag。这些属性都需要一一输入,一两个可能你还愿意自己手动修改,但是多了呢?不仅容易出错,挣钱干活的速度也大大降低了。解决这个问题同样使用PowerShell完成,用到的方法不多,依然是博客以前提到的一些方法,进行了整合。

首先我需要获取到原始vhdx文件的名称,它包含在“路径”属性中,类似下面的形式

\\vm121.contoso.com\MSSCVMMLibrary\M-CentOS64.vhdx

我只需要M-CentOS64.vhdx部分,第一次,我用了一个很傻的方法,下面是伪代码

1
2
3
4
5
6
7
8
9
10
11
$GHD 
Get-SCVirtualHardDisk
#这是一种效率比较低的方法
$2b 
$GHD
.name
$2b
$zz 
= (
Get-SCVirtualHardDisk 
-name 
$2b
).SharePath 
$zz 
$zz 
-replace 
"\\"
, "
"
#必须填写vhdx文件所在的库服务器名和库共享名
$zz = $zz -replace "
vm121.contoso.com
", ""
$zz = $zz -replace "
MSSCVMMLibrary
", ""
Add-Member -InputObject $tagx -MemberType NoteProperty -Name "
vhdxname2" -value 
$zz  
-Force 
#写入变量到vhdxname2这个属性当中
}

那么上面这个方法为什么说比较傻呢?因为它只是用-replace做了替换的方法,这个时候需要替换三次,第一次替换\,第二次替换库名字,第三次替换库共享名,最后剩下的就是文件名了。而且这种替换不是通用的,需要手动把变量写进去。

所以我采用了Split的分割方法,效率和通用性一下提高了

1
2
3
$2b 
$tagx
.name
$zz 
= (
Get-SCVirtualHardDisk 
-name 
$2b
).SharePath  
$zz 
=
$zz
.Split(
"\"
)[-1]

这里的意思是说,用\分割,取最后一组数据。

好,我们来看看完整的取数据的代码

1
2
3
4
5
6
7
8
9
$GHD 
Get-SCVirtualHardDisk
foreach
(
$tagx 
in 
$GHD
)
{
[string]
$tagxx 
=
$tagx
.tag
Add-Member 
-InputObject 
$tagx 
-MemberType NoteProperty -Name 
"tagx2" 
-value 
$tagxx  
-Force
$2b 
$tagx
.name
$zz 
= (
Get-SCVirtualHardDisk 
-name 
$2b
).SharePath  
$zz 
=
$zz
.Split(
"\"
)[-1]
Add-Member 
-InputObject 
$tagx 
-MemberType NoteProperty -Name 
"vhdxname2" 
-value 
$zz  
-Force }
$GHD
|select 
Name,FamilyName, OperatingSystem, Release,tagx2,vhdxname2,VirtualizationPlatform| 
Export-Csv 
c:/GRlistold.csv  -Force -Encoding utf8

取了之后,我们需要在新服务器上导入,拷贝上文的c:/GRlistold.csv,然后我们会用到另外一组代码,需要注意的是,在Windows Azure Pack环境中,tag可能是多个数组,这里我的方法只能输入一个数组,所以如果有需要,针对数组方面,还需要自己添加一下。

1
2
3
4
5
6
7
8
9
10
11
12
Import-Csv 
-Path c:/GRlistold.csv | 
foreach 
$vhdxname 
$_
.Name
$vhdxname2 
$_
.vhdxname2 
$OperatingSystem 
$_
.OperatingSystem
$familyName 
$_
.FamilyName
$release 
=  
$_
.Release
$tags 
=  
$_
.tagx2
$VirtualizationPlatform 
$_
.VirtualizationPlatform
$myVHD 
Get-SCVirtualHardDisk 
-name 
$vhdxname
Set-scvirtualharddisk 
–virtualharddisk 
$myVHD 
–OperatingSystem 
$OperatingSystem 
–FamilyName 
$familyName  
–Release 
$release 
–Tag 
$tags  
-name 
$vhdxname2 
-VirtualizationPlatform 
$VirtualizationPlatform
}
Get-SCVirtualHardDisk 
|select 
name,FamilyName, OperatingSystem, Release,tag,VirtualizationPlatform
|ft

本文转自 九叔 51CTO博客,原文链接:http://blog.51cto.com/jiushu/1680016,如需转载请自行联系原作者