IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Acces à des variables ou les noms sont stockés dans un fichiers


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Acces à des variables ou les noms sont stockés dans un fichiers
    Bonjour tout le monde,

    Voici mon problème, j’écris un script qui permet de récupérer les statistiques sur un vCenter. Dans un soucis de configuration et de simplicité sur le long terme, j'essaye d’accéder a des variables de manière dynamique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    ###Variables
    $TabResult_Infos=@()
    $TabInfos=@()
    $File_Infos=Get-Content -Path C:\infos.txt
    $VMs=Get-VM -Name * -WarningAction SilentlyContinue
    foreach ($Info in $File_Infos){
    	$TabInfos+=$Info
    }
    $Object=$TabInfos
    #Region Init tab
    	$Pso_Init = New-Object psobject
    	ForEach ($Line in $Object){
    		Add-Member -Value "Init" -Name $Line -MemberType NoteProperty -InputObject $Pso_Init
    	}
    	$TabResult_Infos+=$Pso_Init
    #EndRegion
    # Variable pour la barre de progression
    $i=0
    $incre=100/$VMs.Count
    
    foreach ($VM in $VMs){
    	$i=$i+$incre
    	Write-Progress -Activity "Récupération des données ..." -CurrentOperation $VM.Name -PercentComplete $i -Status "En cours "
    	
    	###Creation du tableau des infos générales
    		$Pso_Infos = New-Object psobject
    		foreach ($Info in $TabInfos){
    			if ($Info -eq "DatastoreIdList"){
    				switch (($VM.DatastoreIdList)[0]){
    					"Datastore-datastore-2853" { Add-Member -Value "NFS-STO-001-PROD" -Name "DatastoreIdList" -MemberType NoteProperty -InputObject $Pso_Infos }
    					"Datastore-datastore-2852" { Add-Member -Value "NFS-STO-002-PROD" -Name "DatastoreIdList" -MemberType NoteProperty -InputObject $Pso_Infos }
    					default { Add-Member -Value "Autres" -Name "DatastoreIdList" -MemberType NoteProperty -InputObject $Pso_Infos }
    				}
    			}
    			else{
    				Add-Member -Value $VM.$Info -Name $info -MemberType NoteProperty -InputObject $Pso_Infos
    			}
    		}	
    		$Pso_Infos.Notes=$Pso_Infos.Notes -replace "\n",""
    		$TabResult_Infos+=$Pso_Infos
    }
    Le fichier texte "info.txt" ressemble a ceci :
    Name
    DatastoreIdList
    Folder
    NumCpu
    MemoryGB
    PowerState
    Guest.OSFullName
    Guest.State


    J'arrive a accéder aux propriétés qui sont directement en dessous de $VM, cependant les propriétés comme Guest.OSFullName ne sont pas accessible, je n'ai pas d'erreur, mais rien ne s'affiche.
    >$Info="PowerState"
    >$VM.$Info
    >PoweredOn

    >$Info="Guest.OSFullName"
    >$VM.$Info
    >


    J'espère avoir été compréhensible !
    D'avance Merci !

    MB

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    un nom de propriété d'une classe C# ne peut contenir de point, à la différence d'une propriété Powershell (ETS).
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $Objet=1|select 'StartInfo.WindowStyle'
    $Objet.'StartInfo.WindowStyle'='Membre ETS'
    $Objet
    # StartInfo.WindowStyle
    # ---------------------
    # Membre ETS
     
    $PropertyName='StartInfo.WindowStyle'
    $Objet.$PropertyName
    #Membre ETS
    PS utilise donc la chaîne sans effectuer d'itération sur les getters.

    Quelques solutions :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    @'
    StartInfo
    StartInfo.WindowStyle
    '@ > c:\temp\info.txt
     
    $p=get-process -id $pid
    $DebugPreference='continue'
     
    #Invoke-Expression, mais à éviter si possible
    gc c:\temp\info.txt|
    Foreach {
      $PropertyName=$_
      Write-warning $PropertyName
      Invoke-Expression "`$p.$PropertyName"
    }
     
    #Limité à deux niveaux de propriétés
    gc c:\temp\info.txt|
     Foreach {
      $PropertyName=$_
     
      $T=$PropertyName -split '\.'
      if ($t.Count -gt 1)
      { $value=$p.($t[0]).($t[1])}
      else
      {$value=$p."$PropertyName"}
      Write-warning "$PropertyName=$value"
    }
     
    #+verbeux, mais sans limite de niveaux de propriétés
    #exemple: $p.StartInfo.EnvironmentVariables.Count
    gc c:\temp\info.txt| 
     Foreach { 
       $PropertyName=$_
     
       $T=$PropertyName -split '\.'
       if ($T.Count -gt 1)
       { 
         $Object=$p
         $last=$null #visu debug
         foreach ($Name in $T)
         { 
           Write-debug "Current property name : $Name"
           Write-debug "`t Current getter : $($last +='.'+$name) $last" 
           $Object=$Object.$Name 
         }
         $value=$object
       }
       else
       {$value=$p."$PropertyName"}
       Write-warning "$PropertyName=$value"
     }
    Attention à la profondeur de sérialisation (SerializationDepth) des objets sérialisés (Remoting/Job)

Discussions similaires

  1. Réponses: 12
    Dernier message: 30/05/2012, 17h48
  2. Réponses: 6
    Dernier message: 10/11/2011, 14h50
  3. Réponses: 2
    Dernier message: 08/10/2010, 11h15
  4. modifier des tables dont les noms sont dans une autre
    Par lapin_did dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/09/2010, 09h45
  5. Comment les CHAR sont stockés dans Firebird?
    Par badilou dans le forum Firebird
    Réponses: 3
    Dernier message: 27/05/2008, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo