Question Déclaration des variables avant exécution

Plus d'informations
il y a 12 ans 1 mois #17006 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 :

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.

Plus d'informations
il y a 12 ans 1 mois #17011 par Laurent Dardenne
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 \&quot;************************************************************\&quot;
Write-Verbose -Message \&quot;DEBUT $($MyInvocation.MyCommand.Name):: AVEC ENTREE : $Input\&quot;
} # FIN BLOC DE COMMANDES BEGIN

# BLOC CENTRAL DE COMMANDES
PROCESS
{
# DEFINITION DES VARIABLES LOCALES AU BLOC
[hashtable]::${xhsh_Sections}
Write-Warning \&quot;Premier :$(Test-path Variable:«»xhsh_Sections)\&quot;
Write-Verbose -Message \&quot;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;\&quot;
Write-Verbose -Message \&quot;DEBUT TRAITEMENT $($MyInvocation.MyCommand.Name):: - OBJET TRAITE : $_\&quot;
# INITIALISATION TABLEAU ASSOCIATIF DES SECTIONS
# ENSEMBLE D'ENSEMBLES COUPLES (CLEF,VALEUR) A VIDE
${xhsh_Sections} = @{}
Write-Warning \&quot;Second :$(Test-path Variable:«»xhsh_Sections)\&quot;
}
}

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.

Plus d'informations
il y a 12 ans 1 mois #17019 par MALGARINI
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 \&quot;typage fort\&quot;) ; 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.

Plus d'informations
il y a 12 ans 1 mois #17020 par Laurent Dardenne
Paul_M écrit:

J'ai trouvé ce formalisme [type]::${Nom_Variable}.

Ce n'est pas une déclaration de variable, mais l'appel d'une méthode statique d'une classe :
[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.

Plus d'informations
il y a 12 ans 1 mois #17021 par MALGARINI
Merci de tes réponses et conseils.
Je vais revoir ma copie.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.056 secondes
Propulsé par Kunena