2016-07-13 3 views
1

BonsoirPowershell est Réanimation variables dans les scripts

J'ai ce problème avec cette version

PS C:\temp> $PSVersionTable.PSVersion.Major 
4 

Ce problème est vraiment étrange ... malgré des variables initialisées, le script PowerShell est en quelque sorte pouvoir réutiliser les valeurs de variables des invocations précédentes.

Le script est simple; pour montrer le problème, je travaille avec une liste des machines virtuelles:

  1. Lire toutes les machines virtuelles dans un tableau
  2. Sélectionnez le 1er élément du tableau
  3. Ajouter une nouvelle propriété à l'objet de l'étape 2
  4. Le problème: si j'exécute le script une seconde fois, la nouvelle propriété est déjà présente - malgré l'initialisation de toutes les variables. Si je lance le script dans une nouvelle session, la nouvelle propriété est manquante lors de la première exécution, après elle est déjà présente.

Voici le code simple:

Set-StrictMode -Version 2.0 
# Read all Virtual Machines into an Array 
$AllVMs = @() 
$AllVMs = Get-VM 

# Get the 1st Virtual Machine 
$VM = $null 
$VM = $AllVMs[0] 

# Prepare my Property 
$MyList = @() 
$MyList += "Test" 

# If the Property already exists, just add my List 
if ($VM.PSobject.Properties.Name -match "MyList") { 
    $VM.MyList += $MyList 
} else { 
    # My Property does not exist: create it 
    $VM | Add-Member –MemberType NoteProperty –Name MyList –Value ($MyList) 
} 

# Give Back my VM Object 
$VM 

Pour tester le script, je compte seulement le nombre de MyList-éléments:

PS C:\temp> $result = c:\temp\testvar.ps1 
PS C:\temp> $result.MyList.Count 
1 
PS C:\temp> $result = c:\temp\testvar.ps1 
PS C:\temp> $result.MyList.Count 
2 
… 

Est-ce que Somone peut me aider avec ce problème?

Merci beaucoup pour toute aide !!

Cordialement, Tom

+0

Qu'est-ce que ce retour de commande pour vous: '[Objet] :: ReferenceEquals ((Get-VM | Select-Objet -Premier 1), (Get-VM | Select-Object -First 1)) '? – PetSerAl

Répondre

0

j'ai posé cette question à 'le gars de script' Forum aussi.

J'ai deux grandes réponses:

  1. De JRV:
    Vous n'êtes pas sortie de PowerShell. L'objet VM est dynamique pour la session. Il persiste jusqu'à ce que vous fermiez PowerShell. Certains objets sont comme ça. La base de code les traîne à PowerShell et ils restent en cache. Je soupçonne que c'est ce qui se passe ici.

  2. De Evgenij Smirnov:
    Salut,
    cela semble être spécifique à l'objet VM. Si je remplace Get-VM par Get-Process ou Get-ChildItem c: \ je ne rencontre pas ce comportement. Si je sélectionne une nouvelle machine virtuelle chaque fois que j'exécute le script, elle ne conserve pas la propriété. D'un autre côté, si je le fais (Get-VM) [0] .MyList après avoir exécuté le script quatre fois, je reçois quatre entrées.
    Cette persistance est donc évidemment intégrée au module Hyper-V, la propriété personnalisée étant ajoutée à l'instance de l'objet VM lui-même.Ainsi, vous pouvez initialiser MyTest à vide sur toute la collection VM comme ceci:

$AllVMs | foreach { 
    if ($_.PSobject.Properties.Name -match "MyList") { 
    $_.MyList = @() 
    }  
} 

Sincères salutations, Tom