gpt4 book ai didi

powershell - 发布构建 PowerCLI Mass OVF 导出工具

转载 作者:行者123 更新时间:2023-12-03 09:57:19 25 4
gpt4 key购买 nike

背景

我正在使用 PowerCLI 创建一个脚本,以使用 VMware 的 ovftool 执行大量 OVF 导出。该脚本通过执行以下功能来工作:

  • 通过 PowerCLI 参数,获取 vCenter 地址、要导出的 VM 的命名方案以及 OVF 应导出的位置
  • 连接到 vCenter 实例
  • 将所有遵循指定命名方案的虚拟机放入列表
  • 遍历列表并使用 ovftool 和 VM 的构建路径将每个 VM 导出到 ovf

脚本:VMs-to-OVF.ps1

# Take in vCenter address, naming scheme of VMs to be exported, and where the OVFs should be exported

param (

[string]$vcenter = $(throw "

vCenter address required.`n

Example:`n

.\VMs-to-OVF.ps1 -vcenter <192.168.1.200>`n

.\VMs-to-OVF.ps1 -vcenter <vcenter.test.com>"),

[string]$vmNamingScheme = $(throw "

VM naming scheme required.`n

Example:`n

.\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

test/> -vmNamingScheme <test-vm-1>`n

.\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

test/> -vmNamingScheme <test-vm-*>`n"),

[string]$exportLocation = $(throw "

Export location required.`n

Example:`n

.\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

test/> -vmNamingScheme <test-vm-1> -exportLocation 192.168.1.100:\`n

.\VMs-to-OVF.ps1 -vcenter <vcenterIP/DNS> -vmPath </DATACENTER/vm/`n

test/> -vmNamingScheme <test-vm-*> -exportLocation X:\`n")

)

# Connect to vCenter

Connect-VIServer -Server $vcenter

# $VMs is an array of VM names that will be exported
# $vmNamingScheme gives the VM naming pattern we are looking for

$VMs = $(get-vm -name $vmNamingScheme | select name | format-list | out-string)
$VMs = $VMs.replace("Name : ","")
$VMs = $VMs.replace(" ","")
$VMs = $VMs.split("`n")
$VMs = $VMs|?{$_ -ne $VMs[1]}

# This loop iterates through the $VMs array and performs an OVF export, to the location
# specified in $exportLocation, for each VM name in the array
# $vmPath is comprised of the path to the VM and $VM holds the actual VM name

foreach ($VM in $VMs){
if ($VMs -ne $null){

# ***THIS SCRIPT ASSUMES THE get-vmfolderpath SCRIPT IS IN THE SAME DIRECTORY AS ITSELF***
# get the folder path of the VM using the get-vmfolderpath script (this will align with
# the path in vSphere Folders and Templates view)

$vmPath = "get-vm -name $VM | .\get-vmfolderpath.ps1"
&$vmPath

# ***THIS SCRIPT ASSUMES THE DEFAULT INSTALL PATH FOR THE ovftool PROGRAM
# run the ovftool command with the proper arguments

&'C:\Program Files\VMware\VMware OVF Tool\ovftool.exe' vi://$vcenter$vmPath$VM $exportLocation
}
}

伴随脚本:get-vmfolderpath

param(
[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[string]$folderid,
[switch]$moref
)

$folderparent=get-view $folderid

if ($folderparent.name -ne 'vm'){
if($moref){
$path=$folderparent.moref.toString()+'\'+$path
}
else{
$path=$folderparent.name+'\'+$path
}
if ($folderparent.parent){
if($moref){
get-vmfolderpath $folderparent.parent.tostring() -moref
}
else{
get-vmfolderpath($folderparent.parent.tostring())
}
}
}
else {
if ($moref){
return (get-view $folderparent.parent).moref.tostring()+"\"+$folderparent.moref.tostring()+"\"+$path
}
else {
return (get-view $folderparent.parent).name.toString()+'\'+$folderparent.name.toString()+'\'+$path
}
}

错误

如果您将文本复制并粘贴到 PowerCLI 控制台,for 循环的每次迭代中内置的 ovftool 命令将起作用,但直接从脚本运行时则不起作用。从脚本中运行自定义 ovftool 命令时会产生以下错误:

The term 'get-vm -name VM-NAME | .\get-vmfolderpath.ps1' is not
recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.At
C:\Users\username\Desktop\VMs-to-OVF.ps1:85 char:4
+ &$vmPath
+ ~~~~~~~
+ CategoryInfo : ObjectNotFound: (get-vm -name CA...mfolderpath.p
s1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

我检查过的事情:

  • 直接在 PowerCLI 控制台中运行“get-vm -name vm_name | .\get-vmfolderpath.ps1”的输出返回正确的 VM 路径
  • 所有变量输出期望值
  • 如果在 PowerCLI 控制台中运行脚本中生成的确切 ovftool 命令,则它将正确导出 VM

最佳答案

只是结束这个循环。我找到了解决我的问题的方法。我的猜测是,当您操作 Get-VM cmdlet 返回的 VM 列表时,会丢失一些东西。在 VMs-to-OVFs 脚本中,如果所有“$VM =”行都被下面的一行替换,那么该信息将被保留。

$VMs = get-vm -name $vmNamingScheme

在 for 循环中使用“.Name”属性将每个单独的 VM 对象传递给 get-vmfolderpath 脚本。

$vmPath = get-vm -name $VM.Name | .\get-vmfolderpath.ps1

关于powershell - 发布构建 PowerCLI Mass OVF 导出工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30808178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com