I want to move VMs to a folder name called Linux, but we have multiple folder by the same name in our Datacenter, please provide me PowerCLI Script to move exactly.
I tried to use to the below FolderByPath function, but not sure how to use it and get worked. Please help me in this.
function Get-FolderByPath{
<#
.SYNOPSIS Retrieve folders by giving a path
.DESCRIPTION The function will retrieve a folder by it's
path. The path can contain any type of leave (folder or
datacenter).
.NOTES Author: Luc Dekens
.PARAMETER Path
The path to the folder.
This is a required parameter.
.PARAMETER Path
The path to the folder.
This is a required parameter.
.PARAMETER Separator
The character that is used to separate the leaves in the
path. The default is '/'
.EXAMPLE
PS> Get-FolderByPath -Path "Folder1/Datacenter/Folder2"
.EXAMPLE
PS> Get-FolderByPath -Path "Folder1>Folder2" -Separator '>'
#>
param(
[CmdletBinding()]
[parameter(Mandatory = $true)]
[System.String[]]${Path},
[char]${Separator} = '/'
)
process{
if((Get-PowerCLIConfiguration).DefaultVIServerMode -eq "Multiple"){
$vcs = $defaultVIServers
}
else{
$vcs = $defaultVIServers[0]
}
foreach($vc in $vcs){
foreach($strPath in $Path){
$root = Get-Folder -Name Datacenters -Server $vc
$strPath.Split($Separator) | %{
$root = Get-Inventory -Name $_ -Location $root -Server $vc -NoRecursion
if((Get-Inventory -Location $root -NoRecursion | Select -ExpandProperty Name) -contains "vm"){
$root = Get-Inventory -Name "vm" -Location $root -Server $vc -NoRecursion
}
}
$root | where {$_ -is [VMware.VimAutomation.ViCore.Impl.V1.Inventory.FolderImpl]}|%{
Get-Folder -Name $_.Name -Location $root.Parent -Server $vc
}
}
}
}
}
You can try to fetch the folder object stepwise as well.
Something like this for example
$folder = Get-Datacenter -Name "LTX01-G8" | Get-Folder -Name "LTX-Servers" | Get-Folder -Name "LTX Servers 0000 - 0299" | Get-Folder -Name Linux
I assume the first qualifier in your path was the datacenter.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
The Get
-FolderByPath
function from my Folder by Path post returns a folder object.
That folder object can then be used on any parameter that accepts a folder object.
For example,
$folder = Get-FolderByPath -Path "DC1/Blue1/Blue12/Blue121/Linux"
Get-VM -Name Srv1 | Move-VM -Destination $folder
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
Thanks for the reply.. what I have done is " Saved the script as FolderbyPath.Ps1" and tried to run the command but the PowerCLI is throwing error as below. How should I run functions in PowerCLI..
For a function that is stored in a .ps1 file, you will have to dot-source the .ps1 file.
In other words, feed the function definition to the PowerShell engine, so you can call it later on.
For that do
. ./FolderByPath.ps1
Note that there is a blank between the 2 dots.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
I ran the script as you said, when I ran the script its not giving any output..just prompt is coming after a minute.
Once the function is dot-sourced, you can call it.
So you do
. ./FolderByPath.ps1
$folder = Get-FolderByParh -Path "LTX01-G8/LTX-Servers/LTX Servers 0000 - 0299/Linux"
Get-VM -Name YourVM | Move-VM -Destination $folder
This will move 1 VM, called YourVM to the folder.
Note that you have to do the dot-sourcing only once in your session.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
I saved the below content as MoveVM.PS1 and ran the command but its still giving error as earlier.
. ./FolderByPath.ps1
$folder = Get-FolderByPath -Path "LTX01-G8\LTX-Servers\LTX Servers 0000 - 0299\Linux"
Get-VM -Name ltxl0278 | Move-VM -Destination $folder
Error Screenshot:
I have opened a new PowerCLi windows and ran the script, seems that now its running script, however its giving error while collecting Inventory details.
Try using the forward slash (/) instead of the back slash (\) in the path.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Tried using backward slash and its stil giving the same error, Lucd I just want to know cant we move the VMs to Folder by knowing the FolderIDs..
You can try to fetch the folder object stepwise as well.
Something like this for example
$folder = Get-Datacenter -Name "LTX01-G8" | Get-Folder -Name "LTX-Servers" | Get-Folder -Name "LTX Servers 0000 - 0299" | Get-Folder -Name Linux
I assume the first qualifier in your path was the datacenter.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Great it worked like a charm..you made it.. Thanks a ton LucD..