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 :

Export de suite de variable [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Invité
    Invité(e)
    Par défaut Export de suite de variable
    Bonjour à tous et à toutes !

    Je me suis lancé dans le vaste univers de Powershell dans le but de me facilité une tâche récurrente. Je dois récupérer plusieurs informations sur des postes (applications, raccourcis sur le bureau etc)

    Après quelques heures de recherches voici le premier jet de mon script :

    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
    
    #Création des variables
    $printer = Get-WmiObject win32_printer | select caption,Portname;
    $drive = Get-WmiObject win32_logicaldisk
    $ink = ls -l C:\Users\$env:username\Desktop | select Name;
    $machine = [Environment]::MachineName;
    $utilisateur = whoami
    $apps = Get-WmiObject -Class Win32_Product | Select-Object -Property Name | Sort-Object Name
     
    $result =
    {
    "######## INFO UTILISATEUR ########"
    "Domaine/Nom d'utilisateur :"
    $utilisateur
    "Nom du poste actuel :"
    $machine
    "######## APPLICATIONS ########"
    $ink
    $apps
    "######## LECTEURS RESEAUX ########"
    Invoke-expression $drive
    "######## IMPRIMANTES ########"
    Invoke-expression $printer
    }
    $result | Out-File C:\Temp\imac.txt
    Oui la seconde partie est un peu WTF, c'est normal c'est des tests que j'effectue ^^

    Sur la déclaration des variables pas de problème. Par contre, je n'arrive pas à exporter le contenu de celles-ci dans le fichier texte. J'ai tenté d'inclure le contenue dans une variable et de piper avec out-file. Quand je met des accolades, tout apparaît dans le txt mais les variables ne sont pas exécutées (il me met tout en texte brut), sans accolade, les valeurs s'affiche sur la fenêtre powershell mais le $result s'arrête à la première ligne.

    Ma question est : comment faire pour que le contenu de toutes les variables s'insère avec la mise en forme dans le fichier txt ? J'ai tenté de faire un export de l'écran powershell dans un txt mais cela n'a pas fonctionné. J'ai regardé pas mal de doc mais je ne trouve pas réellement ce que je recherche.

    Si vous avez des idées pour optimiser le script, de la documentation je suis preneur :)

    Merci d'avance pour votre aide !

  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,
    ton code actuel crée un scriptblock, du code :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $result =
    { 
     ...
    }
    il faut utiliser une here-string avec substitution :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $i='variable'
    $result =@"
     Contenu : $i
     suite...
    "@
    $result > c:\temp\file.txt
    type c:\temp\file.txt

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Laurent pour ta réponse !

    En effet, maintenant le tout s'exporte bien.. ou presque !

    Si je passe par le here-string avec substitution, la variable $apps et $ink ne passe plus. Quand celles-ci sont exécutées via la console aucun problème... Étrange tout ça !

    J'ai pensé que cela pouvait venir du fichier texte qui n'était pas assez grand mais je doute que ce soit ça (j'ai testé avec un | Out-file -Width 120 mais toujours rien)

    Merci encore pour l'aide apportée :)

    Cordialement,

  4. #4
    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
    Citation Envoyé par Ranma56 Voir le message
    Étrange tout ça !
    On peut le penser si on ne connait pas les comportements de Powershell et de dotNet.

    Les variables $ink et $apps sont des tableaux d'objet du type PsCustomObject, car Select-Object crée un nouvel objet.
    Ce qui fait que la méthode ToString() n'est plus définie sur chacun de ces objets :
    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
     
    $f=dir
    $f[0].tostring()
    #Nom de fichier
     
    "$($f[0])"
    #Nom de fichier
     
    "$f" #affiche tous les noms
     
    $f2=dir|select name
    $f2[0].tostring()
    #rien
     
    "$($f2[0])"
    #affiche l'objet en tant que psobjet
    #@{Name=Nom de fichier}
     
    "$f2" #N'affiche rien, mais le résultat dépend du contenu de $OFS
    Il faut donc utiliser le paramètre -ExpandProperty du cmdlet Select-Object, ainsi on récupère des objets de type String, la propriété 'Name' étant du type String, la substitution peut donc fonctionner :

    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
     
    #Création des variables
    $printer = Get-WmiObject win32_printer | select caption,Portname
    $drive = Get-WmiObject win32_logicaldisk
    $ink = ls -l C:\Users\$env:username\Desktop | select -ExpandProperty Name
    $machine = [Environment]::MachineName
    $utilisateur = whoami
    $apps = Get-WmiObject -Class Win32_Product | Select-Object -ExpandProperty Name | Sort-Object Name
     
    #Mémorise le séparateur de champ actuel puis le redéfini
    $oldofs=$ofs 
    $ofs="`r`n" #insère un retour chariot entre chaque élément d'un tableau
    #[byte[]][char[]]$ofs  #DEBUG: affiche le contenu 
     
    $result =@"
    ######## INFO UTILISATEUR ########
    Domaine/Nom d'utilisateur :
    $utilisateur
    Nom du poste actuel :
    $machine
    ######## APPLICATIONS ########
    $ink
    $apps
    ######## LECTEURS RESEAUX ########
    $drive
    ######## IMPRIMANTES ########
    $printer
    "@
    #Restaure le séparateur de champ
    $ofs=$oldofs
    $result > C:\Temp\imac.txt
    type C:\Temp\imac.txt
    En passant, dans ton rapport, on ne sait pas/plus différencier les répertoires des fichiers contenus dans $ink.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé pour la réponse tardive, j'ai été pas mal pris :)

    J'ai fais plusieurs tests et en effet presque tout est fonctionnel sauf ceux qui utilisent plusieurs argument dans Select-Object par exemple les imprimantes.

    J'ai adapté un peu les différentes commandes des variables mais celle pour les lecteurs réseaux ($drive) j'en ai besoin afin d'avoir un chemin clair ( j'ai tenté de faire un net use mais pas très malléable comme commande....)

    J'ai un peu regardé sur le net et je n'ai pas trouvé de réelles solutions pour inclure toutes les composantes voulus (j'ai testé avec For Each mais ça na rien donné)

    Et oui pour le $ink je sais bien, c'est pour récupérer des raccourcis TSE et applications Citrix mais j'optimiserais cela par la suite ^^

    C'est ma dernière question, le script sera complet par la suite !

    Merci encore pour le coup de main.

  6. #6
    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
    Je n'ai pas compris quel est ton dernier pb, peux-tu le reformuler ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bien sûr !

    Dans la commande pour la variable $drive je souhaite utiliser plusieurs objets la commande en gros donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $drive = Get-WmiObject win32_logicaldisk | Select deviceid, filesystem
    Sauf que -ExpandProperty ne fonctionne que sur un argument.

    Du coup, si j’exécute la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $drive = Get-WmiObject win32_logicaldisk | Select - ExpandProperty deviceid, filesystem
    Il ne va rien m'afficher (espace blanc)

    Si je fais ça à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $drive = Get-WmiObject win32_logicaldisk | Select - ExpandProperty deviceid
    Il m’affichera bien les lettre des lecteurs comme ceci mais sans le chemin du lecteur réseau complet :

    Du coup, mon problème est de faire en sorte que $drive récupère bien les deux valeurs attendu (DeviceID et FileSystem) pour faire un chemin complet.

    J'espère avoir été clair du coup ^^

  8. #8
    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
    Ce n'est pas académique comme approche, car on doit séparer la création des données de leur présentation, mais tu peux faire ceci :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $Drive=Get-WmiObject win32_logicaldisk | 
     Select @{name='Info';expression={"{0} {1}" -F $_.deviceid, $_.filesystem}}
    $Drive
    L'inconvénient est que tu te retrouves avec un objet ayant une propriété, il faut donc créer un tableau de chaine :
    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
     
    $Drive=Get-WmiObject win32_logicaldisk | 
     Foreach {"{0} {1}" -F $_.deviceid, $_.filesystem}
    @"
    Drive :
    $Drive
    "@
     
    $oldofs=$ofs 
    $ofs="`r`n"
    @"
    Drive :
    $Drive
    "@
    $ofs=$oldofs
    Tu constateras que les lecteurs amovibles 'vide' n'ont pas d'info 'filesystem' .

  9. #9
    Invité
    Invité(e)
    Par défaut Après un moment d'absence
    Après un long moment d'absence, je reviens donner des nouvelles sur le script Powershell !

    Merci à toi Laurent pour ton aide précieuse. mon script tourne bien ! J'y ai ajouté une pop-up qui donne le chemin du fichier et prévient une fois l'opération terminée.

    Je n'ai pas le code sous la main mais je le posterai si d'autre personne en ont besoin

    Je passe le topic en résolu.

    Merci encore pour le coup de main apporté Laurent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [phpMyAdmin] Export de requête avec variables
    Par cris83500 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/02/2014, 16h37
  2. Gestion d'une suite de variables
    Par Gaetan_ dans le forum Langage
    Réponses: 24
    Dernier message: 04/08/2011, 12h08
  3. [CR 9] Problème export Excel sous etat variable partagée
    Par hubertfabien dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 13/01/2011, 15h56
  4. [WD14] Etat interne : export Word passage de variable
    Par mero007 dans le forum WinDev
    Réponses: 5
    Dernier message: 08/12/2009, 14h50
  5. suite...Ma variable ne passe pas pourquoi ?
    Par pasbonte dans le forum Langage
    Réponses: 28
    Dernier message: 09/11/2009, 17h45

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