这是我第三次发布在本系列。在第一个帖子中,我描述了这个脚本需要的不同组件。然后在第二篇文章中,我开始解释脚本的第一部分是如何工作的。现在,在第三篇文章中,我们将深入到脚本的更丰富的部分,并找出用于进行VM快照的代码。让我们开始吧!
首先,我们循环运行vm并暂停每个vm:
foreach(服务器服务器)美元{#我们扩展虚拟机的存储路径信息#接下来我们用一些逻辑虚拟机是否正在运行。#现在是一些进步的乐趣!
#首先,我们需要为VM本身创建一个对象。
VM = MSVS.findVirtualMachine美元($ Server.Name)
与VS对象一样,我们也需要设置VM对象的安全性。
零美元= [Microsoft.VirtualServer.Interop.Powershell]:: SetSecurity (VM)美元
#我们还需要获取一些VMs文件的位置信息。
#注意,这个脚本只有在所有文件都被找到的情况下才能工作
VMC文件的位置。
$Drive =分割路径$VM。文件限定符
$Path =分割路径$VM.File
带有位置信息的#对象(有点像松鼠把坚果藏起来了!)
add-member -inputObject $Server -membertype noteProperty '
-名称“驱动器”-价值$驱动器
add-member -inputObject $Server -membertype noteProperty '
-name“Path”-value $Path
如果($ VM。州情商5){
#如果VM正在运行,我们需要暂停它。
进步= VM.Save美元()
零美元= '
[Microsoft.VirtualServer.Interop.Powershell]:: SetSecurity(进步)美元
而($进步。100年PercentCompleted lt) {
write progress - activity "Saving - $($Server.Name)"”
地位“进步:”
-PercentComplete (Progress.PercentCompleted美元)
}
需要声明脚本是否暂停了VM。
add-member -inputObject $Server -membertype noteProperty '
-name“pause”-value“Yes”
write progress -Status“Done”-completed $True
}
其他{
需要声明脚本是否暂停了VM。
add-member -inputObject $Server -membertype noteProperty '
- name“暂停”价值“不”
}
}
好吧,这有点代码只是暂停虚拟机。下一步是为每个VM拍一个快照:
这里是我们开始使用vshadow.exe #的地方。这里有些不同。我用的是脚本#然后使用正则表达式从文件中删除这些信息。#接下来,我们将该信息添加到驱动器对象。
foreach ($Drive in $Drives){
write progress - activity“take shapshot - $($Drive.Drive)””
地位“袖手旁观……”
$Null = .\Resources\vshadow.exe -script=var -p $Drive.Drive
#开关参数写影子拷贝设置ID到一个VAR文件。
$ID = get-content var
$ ID =(正则表达式)::匹配($ ID, ' (? < = SHADOW_ID_1 = {) [^ " \ r \ n] * (? =}) ')
add-member -inputObject $Drive -membertype noteProperty '
$ID[0].toString()
我们也删除了那个var文件
remove-item var
}
好了,这篇文章就到这里。在我的下一个帖子中,我们将完成剧本。请记住格式。此外,该脚本中的项没有经过优化。我这样做是有原因的,因为这样更容易理解。第二,我去掉了所有的消息传递、错误处理和日志记录。我生产脚本往往有点过度处理事情。但是,再一次…如果这成为一个备份解决方案,那么它需要完美地工作。考虑到这一点,如果使用了这段代码,您可能需要将这些内容添加回去。