Question
Déclaration des variables avant exécution
- MALGARINI
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 12 ans 1 mois #17006
par MALGARINI
Déclaration des variables avant exécution a été créé par MALGARINI
Bonjour
Voilà le contexte :
je souhaite développer une fonction [cmdlet] qui lit le contenu d'un fichier INI ([SECTIO] clef=valeur, ..) et le transfère dans une variable de type [hastable].
Selon que dans le code de la fonction shsh_LireFichierIni, les variables sont déclarées ou non avant leur utilisation, le fonctionnement diffère :
Les variables en question sont :
[code:1]# DEFINITION DES VARIABLES LOCALES AU BLOC
[hashtable]::${xhsh_Sections}
[string]::${xstr_NomSection}
[long]::${xlng_NbCommentaires}
[string]::${xstr_Clef}
[string]::${xstr_Valeur}[/code:1]
Lorsque les variables sont déclarées avant utilisation dans la fonction :
Le code
[code:1] Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"TEST cmdlet shsh_LireFichierIni\"
Write-Verbose -Message \"===============================================================\"
${shsh_Sections} = shsh_LireFichierIni -NomFichier ${sstr_NomFichier}
Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"LECTURE COMPLETE DU FICHIER ${sstr_NomFichier}\"
Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"SECTION BetaTest | Clef1 DE ${sstr_NomFichier} ==> \"
${shsh_Sections}[\"BetaTest\"][\"Clef1\"]
Write-Verbose -Message \"========================================================================\"
Write-Verbose -Message \"AFFICHAGE VARIABLE\"
${shsh_Sections} | Sort-Object -property name -descending
[/code:1]
affiche :
COMMENTAIRES : NOM DU SCRIPT : Test_2.ps1 - Version 1.0.0a
COMMENTAIRES : ===============================================================
COMMENTAIRES : TEST cmdlet shsh_LireFichierIni
COMMENTAIRES : ===============================================================
COMMENTAIRES : ************************************************************
COMMENTAIRES : DEBUT shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : DEBUT TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : FIN TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : FIN shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : **********************************************************
COMMENTAIRES : ===============================================================
COMMENTAIRES : LECTURE COMPLETE DU FICHIER .\Test2.ini
COMMENTAIRES : ===============================================================
COMMENTAIRES : SECTION BetaTest | Clef1 DE .\Test2.ini ==>
Impossible d'indexer dans un tableau Null.
Au niveau de D:\Développements\Outils\Power Shell\Test_Fichier_Ini\Test_2.ps1 : 610 Caractère : 32
+ ${shsh_Sections}[\"BetaTest\"][ <<<< \"Clef1\"]
+ CategoryInfo : InvalidOperation: (Clef1:String) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
COMMENTAIRES : ========================================================================
COMMENTAIRES : AFFICHAGE VARIABLE
Name Value
----
DomainController {server2, server1, server3}
BetaTest {Clef3, Clef1, Clef2}
ExchangeServer {server2, server1, server3}
Sans déclaration préalable (mise en commentaires) :
[code:1]# DEFINITION DES VARIABLES LOCALES AU BLOC
# [hashtable]::${xhsh_Sections}
# [string]::${xstr_NomSection}
# [long]::${xlng_NbCommentaires}
# [string]::${xstr_Clef}
# [string]::${xstr_Valeur}[/code:1]
le résultat est :
COMMENTAIRES : NOM DU SCRIPT : Test_2.ps1 - Version 1.0.0a
COMMENTAIRES : ===============================================================
COMMENTAIRES : TEST cmdlet shsh_LireFichierIni
COMMENTAIRES : ===============================================================
COMMENTAIRES : ************************************************************
COMMENTAIRES : DEBUT shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : DEBUT TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : FIN TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : FIN shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : **********************************************************
COMMENTAIRES : ===============================================================
COMMENTAIRES : LECTURE COMPLETE DU FICHIER .\Test2.ini
COMMENTAIRES : ===============================================================
COMMENTAIRES : SECTION BetaTest | Clef1 DE .\Test2.ini ==>
Valeur1
COMMENTAIRES : ========================================================================
COMMENTAIRES : AFFICHAGE VARIABLE
Name Value
----
DomainController {server2, server1, server3}
BetaTest {Clef3, Clef1, Clef2}
ExchangeServer {server2, server1, server3}
Un fichier compressé Test_Fichier_Ini.zip est joint et contient :
Le script joint à mon message est \"Test_2.ps1\" et le fichier joint \"Résultats_Test_2_XP.txt\" représente le résultat des commandes sous XP (la première avec la déclaration préalable des variables, la seconde sans déclaration des variables) (après positionnement de $verbosePreferences à \"Continue\")
le fichier joint \"Résultats_Test_2_WIN7.txt\" représente le résultat des commandes sous XP (la première avec la déclaration préalable des variables, la seconde sans déclaration des variables) (après positionnement de $verbosePreferences à \"Continue\")
Plus le fichier \"test2.ini\"
Je cherche une explication à ce fonctionnement.<br><br>Message édité par: Paul_M, à: 17/02/14 17:12
Voilà le contexte :
je souhaite développer une fonction [cmdlet] qui lit le contenu d'un fichier INI ([SECTIO] clef=valeur, ..) et le transfère dans une variable de type [hastable].
Selon que dans le code de la fonction shsh_LireFichierIni, les variables sont déclarées ou non avant leur utilisation, le fonctionnement diffère :
Les variables en question sont :
[code:1]# DEFINITION DES VARIABLES LOCALES AU BLOC
[hashtable]::${xhsh_Sections}
[string]::${xstr_NomSection}
[long]::${xlng_NbCommentaires}
[string]::${xstr_Clef}
[string]::${xstr_Valeur}[/code:1]
Lorsque les variables sont déclarées avant utilisation dans la fonction :
Le code
[code:1] Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"TEST cmdlet shsh_LireFichierIni\"
Write-Verbose -Message \"===============================================================\"
${shsh_Sections} = shsh_LireFichierIni -NomFichier ${sstr_NomFichier}
Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"LECTURE COMPLETE DU FICHIER ${sstr_NomFichier}\"
Write-Verbose -Message \"===============================================================\"
Write-Verbose -Message \"SECTION BetaTest | Clef1 DE ${sstr_NomFichier} ==> \"
${shsh_Sections}[\"BetaTest\"][\"Clef1\"]
Write-Verbose -Message \"========================================================================\"
Write-Verbose -Message \"AFFICHAGE VARIABLE\"
${shsh_Sections} | Sort-Object -property name -descending
[/code:1]
affiche :
COMMENTAIRES : NOM DU SCRIPT : Test_2.ps1 - Version 1.0.0a
COMMENTAIRES : ===============================================================
COMMENTAIRES : TEST cmdlet shsh_LireFichierIni
COMMENTAIRES : ===============================================================
COMMENTAIRES : ************************************************************
COMMENTAIRES : DEBUT shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : DEBUT TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : FIN TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : FIN shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : **********************************************************
COMMENTAIRES : ===============================================================
COMMENTAIRES : LECTURE COMPLETE DU FICHIER .\Test2.ini
COMMENTAIRES : ===============================================================
COMMENTAIRES : SECTION BetaTest | Clef1 DE .\Test2.ini ==>
Impossible d'indexer dans un tableau Null.
Au niveau de D:\Développements\Outils\Power Shell\Test_Fichier_Ini\Test_2.ps1 : 610 Caractère : 32
+ ${shsh_Sections}[\"BetaTest\"][ <<<< \"Clef1\"]
+ CategoryInfo : InvalidOperation: (Clef1:String) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
COMMENTAIRES : ========================================================================
COMMENTAIRES : AFFICHAGE VARIABLE
Name Value
----
DomainController {server2, server1, server3}
BetaTest {Clef3, Clef1, Clef2}
ExchangeServer {server2, server1, server3}
Sans déclaration préalable (mise en commentaires) :
[code:1]# DEFINITION DES VARIABLES LOCALES AU BLOC
# [hashtable]::${xhsh_Sections}
# [string]::${xstr_NomSection}
# [long]::${xlng_NbCommentaires}
# [string]::${xstr_Clef}
# [string]::${xstr_Valeur}[/code:1]
le résultat est :
COMMENTAIRES : NOM DU SCRIPT : Test_2.ps1 - Version 1.0.0a
COMMENTAIRES : ===============================================================
COMMENTAIRES : TEST cmdlet shsh_LireFichierIni
COMMENTAIRES : ===============================================================
COMMENTAIRES : ************************************************************
COMMENTAIRES : DEBUT shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : DEBUT TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : FIN TRAITEMENT shsh_LireFichierIni:: - OBJET TRAITE :
COMMENTAIRES : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMMENTAIRES : FIN shsh_LireFichierIni:: AVEC ENTREE :
COMMENTAIRES : **********************************************************
COMMENTAIRES : ===============================================================
COMMENTAIRES : LECTURE COMPLETE DU FICHIER .\Test2.ini
COMMENTAIRES : ===============================================================
COMMENTAIRES : SECTION BetaTest | Clef1 DE .\Test2.ini ==>
Valeur1
COMMENTAIRES : ========================================================================
COMMENTAIRES : AFFICHAGE VARIABLE
Name Value
----
DomainController {server2, server1, server3}
BetaTest {Clef3, Clef1, Clef2}
ExchangeServer {server2, server1, server3}
Un fichier compressé Test_Fichier_Ini.zip est joint et contient :
La pièce jointe Test_Fichier_Ini.zip est absente ou indisponible
Le script joint à mon message est \"Test_2.ps1\" et le fichier joint \"Résultats_Test_2_XP.txt\" représente le résultat des commandes sous XP (la première avec la déclaration préalable des variables, la seconde sans déclaration des variables) (après positionnement de $verbosePreferences à \"Continue\")
le fichier joint \"Résultats_Test_2_WIN7.txt\" représente le résultat des commandes sous XP (la première avec la déclaration préalable des variables, la seconde sans déclaration des variables) (après positionnement de $verbosePreferences à \"Continue\")
Plus le fichier \"test2.ini\"
Je cherche une explication à ce fonctionnement.<br><br>Message édité par: Paul_M, à: 17/02/14 17:12
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 1 mois #17011
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Déclaration des variables avant exécution
Salut,
je n'ai pas lu tout ton poste, je me suis arrêté a ta déclaration de variable, je n'ai jamais vue cette syntaxe pour déclarer une variable :
[code:1]
function test {
BEGIN
{
# DEFINITION DES VARIABLES LOCALES AU BLOC
Write-Verbose -Message \"************************************************************\"
Write-Verbose -Message \"DEBUT $($MyInvocation.MyCommand.Name):: AVEC ENTREE : $Input\"
} # FIN BLOC DE COMMANDES BEGIN
# BLOC CENTRAL DE COMMANDES
PROCESS
{
# DEFINITION DES VARIABLES LOCALES AU BLOC
[hashtable]::${xhsh_Sections}
Write-Warning \"Premier :$(Test-path Variable:«»xhsh_Sections)\"
Write-Verbose -Message \"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\"
Write-Verbose -Message \"DEBUT TRAITEMENT $($MyInvocation.MyCommand.Name):: - OBJET TRAITE : $_\"
# INITIALISATION TABLEAU ASSOCIATIF DES SECTIONS
# ENSEMBLE D'ENSEMBLES COUPLES (CLEF,VALEUR) A VIDE
${xhsh_Sections} = @{}
Write-Warning \"Second :$(Test-path Variable:«»xhsh_Sections)\"
}
}
1..2|test
set-strictmode -Version latest
1..2|test
set-strictmode -off
${xhsh_Sections}='contains'
[hashtable]::${xhsh_Sections}
[/code:1]
Comme je suis curieux, je veux bien que tu m'expliques
je n'ai pas lu tout ton poste, je me suis arrêté a ta déclaration de variable, je n'ai jamais vue cette syntaxe pour déclarer une variable :
[code:1]
function test {
BEGIN
{
# DEFINITION DES VARIABLES LOCALES AU BLOC
Write-Verbose -Message \"************************************************************\"
Write-Verbose -Message \"DEBUT $($MyInvocation.MyCommand.Name):: AVEC ENTREE : $Input\"
} # FIN BLOC DE COMMANDES BEGIN
# BLOC CENTRAL DE COMMANDES
PROCESS
{
# DEFINITION DES VARIABLES LOCALES AU BLOC
[hashtable]::${xhsh_Sections}
Write-Warning \"Premier :$(Test-path Variable:«»xhsh_Sections)\"
Write-Verbose -Message \"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\"
Write-Verbose -Message \"DEBUT TRAITEMENT $($MyInvocation.MyCommand.Name):: - OBJET TRAITE : $_\"
# INITIALISATION TABLEAU ASSOCIATIF DES SECTIONS
# ENSEMBLE D'ENSEMBLES COUPLES (CLEF,VALEUR) A VIDE
${xhsh_Sections} = @{}
Write-Warning \"Second :$(Test-path Variable:«»xhsh_Sections)\"
}
}
1..2|test
set-strictmode -Version latest
1..2|test
set-strictmode -off
${xhsh_Sections}='contains'
[hashtable]::${xhsh_Sections}
[/code:1]
Comme je suis curieux, je veux bien que tu m'expliques
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- MALGARINI
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 12 ans 1 mois #17019
par MALGARINI
Réponse de MALGARINI sur le sujet Re:Déclaration des variables avant exécution
Bonsoir
comme Je souhaitais, à l'instar d'autres langages tels que VBScript et VBA , déclarer les variables avant leur utilisation (j'adhère au \"typage fort\") ; J'ai au préalable récupérer l'ensemble des différents types disponibles (cf. ss64.com/ps/syntax-datatypes.html ), puis de façon empirique (après accumulation et résolution des messages d'erreur) J'ai trouvé ce formalisme [type]::${Nom_Variable}.
Ne rencontrant pas de problème lors de l'écriture de mes premiers scripts, J'ai continué sur ma lancée, et j'ai rencontré ce problème avec cette fonction.
J'ai effectué de nouvelles recherches sur la toile, au sujet des variables ; et Je m'oriente vers deux solutions :
1. Avant chaque première affectation d'une variable, j'utilise le préfixe de type avant le nom de la variable, mais les déclarations seront disséminées dans le code.
2. J'utilise une affectation par défaut, dans ma zone de code où Je souhaite regrouper toutes les déclarations de variables.
Je vais tester le script communiqué.
comme Je souhaitais, à l'instar d'autres langages tels que VBScript et VBA , déclarer les variables avant leur utilisation (j'adhère au \"typage fort\") ; J'ai au préalable récupérer l'ensemble des différents types disponibles (cf. ss64.com/ps/syntax-datatypes.html ), puis de façon empirique (après accumulation et résolution des messages d'erreur) J'ai trouvé ce formalisme [type]::${Nom_Variable}.
Ne rencontrant pas de problème lors de l'écriture de mes premiers scripts, J'ai continué sur ma lancée, et j'ai rencontré ce problème avec cette fonction.
J'ai effectué de nouvelles recherches sur la toile, au sujet des variables ; et Je m'oriente vers deux solutions :
1. Avant chaque première affectation d'une variable, j'utilise le préfixe de type avant le nom de la variable, mais les déclarations seront disséminées dans le code.
2. J'utilise une affectation par défaut, dans ma zone de code où Je souhaite regrouper toutes les déclarations de variables.
Je vais tester le script communiqué.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 1 mois #17020
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Déclaration des variables avant exécution
Paul_M écrit:
[code:1]
${Nom_Variable}='Compare'
[string]::${Nom_Variable}
[/code:1]
Ici tu ne crée pas de variable, mais tu paramètres le nom de la méthode, ce qui est confirmé par le cmdlet Test-Path sur le provider de variable.
Tu dois procéder ainsi :
[code:1]
#a minima
$Var=$null
#typé
[String]$Var=$null
#typé + scope
[String]$global:Var=$null
[/code:1]
Ou utiliser le cmldet New-Variable.
Les specs de PS v2 .
Si tu corriges ce point le reste sera + facile à debugger.
Quant aux déclaration elles se font au fil de l'eau, notamment via la clause param des fonctions. Elles sont 'supprimés' automatiquement en fin d'appel.
J'utilise rarement cette approche, ensuite chacun procède comme il l'entend
Sous PS l'initialisation des variables ne vaut que si on utilise des globales et que l'on bascule la session en mode strict :
[code:1]set-strictmode -Version latest[/code:1]
Enfin comme PS est dynamique rien ne t'assure de tjr utiliser des variables initialisées, par exemple une variable mal orthographiè passera au travers de ce type de contrôle.
Ce n'est pas une déclaration de variable, mais l'appel d'une méthode statique d'une classe :J'ai trouvé ce formalisme [type]::${Nom_Variable}.
[code:1]
${Nom_Variable}='Compare'
[string]::${Nom_Variable}
[/code:1]
Ici tu ne crée pas de variable, mais tu paramètres le nom de la méthode, ce qui est confirmé par le cmdlet Test-Path sur le provider de variable.
Tu dois procéder ainsi :
[code:1]
#a minima
$Var=$null
#typé
[String]$Var=$null
#typé + scope
[String]$global:Var=$null
[/code:1]
Ou utiliser le cmldet New-Variable.
Les specs de PS v2 .
Si tu corriges ce point le reste sera + facile à debugger.
Quant aux déclaration elles se font au fil de l'eau, notamment via la clause param des fonctions. Elles sont 'supprimés' automatiquement en fin d'appel.
J'utilise rarement cette approche, ensuite chacun procède comme il l'entend
Sous PS l'initialisation des variables ne vaut que si on utilise des globales et que l'on bascule la session en mode strict :
[code:1]set-strictmode -Version latest[/code:1]
Enfin comme PS est dynamique rien ne t'assure de tjr utiliser des variables initialisées, par exemple une variable mal orthographiè passera au travers de ce type de contrôle.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- MALGARINI
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
il y a 12 ans 1 mois #17021
par MALGARINI
Réponse de MALGARINI sur le sujet Re:Déclaration des variables avant exécution
Merci de tes réponses et conseils.
Je vais revoir ma copie.
Je vais revoir ma copie.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.053 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Déclaration des variables avant exécution