Independemment de la portabilité des variable dans un script, un problème se pose lorsque vous souhaitez, dans un script, accéder des variable locales depuis des commandes executées sur une machine distante.
Exemple:
$vmmserver="monserveurvmm.home.com"
$VmToStop="c:\BackupAdmin\VMToStop.txt"
if (!(test-path $VmToStop))
{
write-host "le fichier des VM $VmToStop a eteindre introuvable. le script va s'arreter"
Exit
}
else
{
$VmToStop= Get-Content $VmToStop
foreach ($vm in $VmToStop)
{
Invoke-Command -ComputerName $vmmserver -ScriptBlock {
param($vm,$vmmserver)
Add-PSSnapin microsoft.systemcenter.virtualmachinemanager
$vmstatus= (get-vm -Name $vm -VMMServer $vmmserver | Select-Object -Property status)
if ($vmstatus.status -eq "running")
{
write-host "La VM $vm est démarré et va etre arretée"
Shutdown-VM -VM $vm
}
elseif ($vmstatus.status -eq "PowerOff")
{
write-host "La VM $vm est déja arrétée"
Exit
}
} -Argumentlist $vm,$vmmserver
}
}
##################################
Dans ce script qui recherche dans un fichier “VMToStop.txt” une liste de machine virtuelles a arrêter, un bloc de commande est executé a distance (Invoke-Command -ComputerName $vmmserver -ScriptBlock { } ) sur un serveur scvmm. Comment faire en sorte que les commandes executées a distance connaissent les variables locales $vm et $vmmserver ?
param($vm,$vmmserver) va permettre de declarer une liste de variable dans le ScriptBlock
-Argumentlist $vm,$vmmserver va permettre de faire la liaison entre le contenu de param et les variables locales.
A noter que le nom des variables déclarées par param est arbitraire, mais il est nécéssaire que ces variables soit dans le meme ordre que celles de –Argumentlist .