Issue Building PowerCLI Mass OVF Export Tool
随附脚本:get-vmfolderpath
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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命令时,会产生以下错误:
1 2 3 4 5 6 7 8 9 10 | 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路径
所有变量均输出期望值
如果在脚本中生成的确切ovftool命令在PowerCLI控制台中运行,则它将正确导出VM
为什么使用
ovftool 而不是
Export-vApp ?如果失败,
$vmpath 的确切值是多少?除
ovftool 调用外,您似乎对其他参数也存在问题。
我对该帖子做了些微修改。现在,我只是尝试使用以下方法构造VM的路径:
$vmPath ="get-vm -name $VM | .\\get-vmfolderpath.ps1" &$vmPath 我在这里得到的错误也略有不同。我已经更新了帖子中的"错误"块。另外,我不知道Export-vApp可用于导出OVF。真的吗?
$vmpath 的值是命令字符串。不是命令块,也不是该命令的结果,等等。是否要在那时运行该命令并将结果存储在
$vmpath 中?如果是这样,那么您就不需要引号。如果您想创建一个命令块,那么我相信您想用大括号替换引号。
在
Export-vApp 上有一个
-Format 标志,该标志接受
OVF 和
OVA ,其中
OVF 是默认值。但是
OVA 只是一个tar归档文件,因此即使它只能执行
OVA ,您也始终可以手动将其提取出来。
如果使用花括号,则会出现错误:
Get-VM VM with name VM-NAME was note found using specified filter(s). 此外,如果使用命令:
Export-VApp -Destination $exportLocation -VM $VM ,则会出现错误
Export-VApp: Could not find find VirtualMachine with name VM-NAME 。我开始怀疑我是否传递了错误的VM名称或其他名称。我现在只是猜测。
什么是
VM-NAME ?您可以将它与
Get-VM 一起使用并获得所需的虚拟机吗?
Export-vApp 的
-VM 标志要求vm对象不是字符串。因此,我不太了解这种情况下的错误意味着什么(除非您可能使用了视图,并且虚拟机以某种方式从视图下移动/更改了)。
查找具有唯一名称的VM。呼叫
Get-VM -Name"Unique VM Name" 。它行得通吗?如果确实可以使用运行
Export-VApp -Name"Unique VM Name" ?可以使用
$vm = Get-VM -Name"Unique VM Name"; Export-VApp -VM $vm 吗?我目前不知道您在测试中使用的vm:s名称是什么,但这只是vm的名称,不是路径,不是moref等。
VM-NAME只是我检查了VM的实际名称。它只是一个字符串,而不是get-vm的内容。当我运行
Get-VM -Name VM-NAME 时,它会以正确的输出进行响应。当我运行
Export-VApp -VM VM-NAME -Destination Y: 时,它将把VM作为OVF导出到Y驱动器。
-VM 采用的是vm对象而不是名称。但是,如果要使用
Export-vApp ,它也有一个
-Name 参数。
当我从脚本内运行
Export-VApp -Name $VM -Destination $exportLocation 时,我会得到
Export-VApp: Cannot bind parameter Name to the target 。如果我在脚本外运行相同的内容,则会成功导出VM。我还尝试通过首先指定
$VM = get-vm -name $VM 来获取VM对象,并在Export-VApp中使用-VM标志来运行相同的命令。两种方法都行不通。有什么想法吗?
是
-Name [vmobject] 吗?因为那行不通。我很难遵循您的实际尝试,因为您的脚本很复杂并且变量名的用法不一致。
当我在Export-VApp命令之前指定
$VM = get-vm -name $VM 时,我会假定这会将$ VM转换为VM对象?但是,当我不指定该规格时,$ VM是$ VMs列表中的一个字符串,该字符串由脚本中的以下行确定:
$VMs = $(get-vm -name $vmNamingScheme | select name | format-list | out-string) ,然后开始拆分和解析。
停止关注名字。
Get-VM 为您提供vm对象的列表。这些正是您要进行导出操作所需要的。只需使用它们。而不是将名称输出按摩成可再次使用的模糊名称。
只需关闭此循环即可。我找到了解决问题的方法。我的猜测是,当您操纵由Get-VM cmdlet返回的VM列表时,会丢失一些东西。在VM到OVF脚本中,如果所有" $ VM = "行都被下面的单行替换,则将保留该信息。
$VMs = get-vm -name $vmNamingScheme
在for循环中,使用"。Name "属性将每个单独的VM对象传递给get-vmfolderpath脚本。
$vmPath = get-vm -name $VM.Name | .\\get-vmfolderpath.ps1