Question
Boucle
- asceltis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 4
- Remerciements reçus 0
il y a 6 ans 9 mois #29026
par asceltis
Bonjour,
je débute totalement dans le scripting powershell, j'aurai besoin de votre aide. Je dois vérifier la présence de plusieurs fichiers, j'étais donc partie sur cela :
[code:1]#Déclaration des fichiers à chercher
$dump1 = \"toto1.dmp\"
$dump2 = \"toto2.dmp\"
$dump3 = \"toto3.dmp\"
if ((test-path \"D:\\$dump1\"«») -eq $false)
{Write-Host $dump1 \"Absent\"}
else {
$File=Get-ChildItem \"D:\\$dump1\"
Write-Host $dump1 \"- Présent\" \"- Date :\" $File.LastWriteTime
}[/code:1]
je suppose qu'il y a moyen de faire cette commande pour tous les variables déclarées en premier avec mise en place d'une boucle, mais je sèche
je vous remercie pour votre concours
je débute totalement dans le scripting powershell, j'aurai besoin de votre aide. Je dois vérifier la présence de plusieurs fichiers, j'étais donc partie sur cela :
[code:1]#Déclaration des fichiers à chercher
$dump1 = \"toto1.dmp\"
$dump2 = \"toto2.dmp\"
$dump3 = \"toto3.dmp\"
if ((test-path \"D:\\$dump1\"«») -eq $false)
{Write-Host $dump1 \"Absent\"}
else {
$File=Get-ChildItem \"D:\\$dump1\"
Write-Host $dump1 \"- Présent\" \"- Date :\" $File.LastWriteTime
}[/code:1]
je suppose qu'il y a moyen de faire cette commande pour tous les variables déclarées en premier avec mise en place d'une boucle, mais je sèche
je vous remercie pour votre concours
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 6 ans 9 mois #29027
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Boucle
Salut,
essaie ceci :
[code:1]
$dump1 = \"toto1.dmp\"
$dump2 = \"toto2.dmp\"
$dump3 = \"toto3.dmp\"
$dump1,$dump2,$dump3|
ForEach-Object{
if ((test-path \"D:\\$_\"«») -eq $false)
{ Write-Host $_ \"Absent\" }
else {
$File=Get-ChildItem \"D:\\$_\"
Write-Host $_ \"- Présent\" \"- Date :\" $File.LastWriteTime
}
}
#ou
forEach( $DumpFile in $dump1,$dump2,$dump3)
{
if ((test-path \"D:\\$DumpFile\"«») -eq $false)
{ Write-Host $dumpFile \"Absent\" }
else {
$File=Get-ChildItem \"D:\\$DumpFile\"
Write-Host $dumpFile \"- Présent\" \"- Date :\" $File.LastWriteTime
}
}
#Petite amélioration
forEach( $Nom in 'toto1.dmp','toto2.dmp','toto3.dmp')
{
$NomComplet=\"D:\\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
[/code:1]
Voir aussi l'aide en ligne .<br><br>Message édité par: Laurent Dardenne, à: 17/06/19 12:43
essaie ceci :
[code:1]
$dump1 = \"toto1.dmp\"
$dump2 = \"toto2.dmp\"
$dump3 = \"toto3.dmp\"
$dump1,$dump2,$dump3|
ForEach-Object{
if ((test-path \"D:\\$_\"«») -eq $false)
{ Write-Host $_ \"Absent\" }
else {
$File=Get-ChildItem \"D:\\$_\"
Write-Host $_ \"- Présent\" \"- Date :\" $File.LastWriteTime
}
}
#ou
forEach( $DumpFile in $dump1,$dump2,$dump3)
{
if ((test-path \"D:\\$DumpFile\"«») -eq $false)
{ Write-Host $dumpFile \"Absent\" }
else {
$File=Get-ChildItem \"D:\\$DumpFile\"
Write-Host $dumpFile \"- Présent\" \"- Date :\" $File.LastWriteTime
}
}
#Petite amélioration
forEach( $Nom in 'toto1.dmp','toto2.dmp','toto3.dmp')
{
$NomComplet=\"D:\\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
[/code:1]
Voir aussi l'aide en ligne .<br><br>Message édité par: Laurent Dardenne, à: 17/06/19 12:43
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- asceltis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 4
- Remerciements reçus 0
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 6 ans 9 mois #29029
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Boucle
asceltis écrit:
Les itérateurs fonctionnent comme une boucle, mais en simplifiant l'écriture.
Quant au pipeline ($dump1,$dump2,$dump3|ForEach-Object ... ) c'est un enchaînement de commandes effectué une ou plusieurs fois.
En interne c'est ce que le framework dotnet fait.oh merci bien
j’étais parti avec un for et création de compteur... en résumé pas du tout dans la bonne direction
Les itérateurs fonctionnent comme une boucle, mais en simplifiant l'écriture.
Quant au pipeline ($dump1,$dump2,$dump3|ForEach-Object ... ) c'est un enchaînement de commandes effectué une ou plusieurs fois.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- asceltis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 4
- Remerciements reçus 0
il y a 6 ans 9 mois #29030
par asceltis
du coup si je veux m'envoyer un mail avec le résultat du script, il faut que je l'inclue dans :
[code:1]$smtpserver = \"mail.domaine.local\"
$from = \"mon adresse mail@domaine.local\"
$to = \"adresses destinataires@domaine.local\"
$subject = \"Fichiers Dumps\"
$body = \"
<html>
<head><head>
<body>
<p> Bonjour,<br/>
Etat des fichiers dumps à surveiller : <br />
forEach( $Nom in 'toto1.dmp','toto2.dmp','toto3.dmp')
{
$NomComplet=\"D:\\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
forEach( $Nom in 'tata1.dmp','tata2.dmp','tata3.dmp')
{
$NomComplet=\"\\server\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
</p>
</body>
</html>
send-mailmessage -smtpserver $smtpserver -from $from -to $to -sudject $subject -body $body -bodyashtml -priority high
[/code:1]
est-ce correct ? ou alors faut-il concaténer le script (car je fait plusieurs recherche à plusieurs endroit du réseau ) dans une variable globale et juste appeler la variable dans le body du mail ?
encore merci pour le coup de main.
[code:1]$smtpserver = \"mail.domaine.local\"
$from = \"mon adresse mail@domaine.local\"
$to = \"adresses destinataires@domaine.local\"
$subject = \"Fichiers Dumps\"
$body = \"
<html>
<head><head>
<body>
<p> Bonjour,<br/>
Etat des fichiers dumps à surveiller : <br />
forEach( $Nom in 'toto1.dmp','toto2.dmp','toto3.dmp')
{
$NomComplet=\"D:\\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
forEach( $Nom in 'tata1.dmp','tata2.dmp','tata3.dmp')
{
$NomComplet=\"\\server\$Nom\"
if (Test-Path $NomComplet )
{
$File=Get-ChildItem $NomComplet
$Message=\"'$Nom' - Présent - Date : $($File.LastWriteTime)\"
}
else
{ $Message=\"'$Nom' absent\" }
Write-Host $Message
}
</p>
</body>
</html>
send-mailmessage -smtpserver $smtpserver -from $from -to $to -sudject $subject -body $body -bodyashtml -priority high
[/code:1]
est-ce correct ? ou alors faut-il concaténer le script (car je fait plusieurs recherche à plusieurs endroit du réseau ) dans une variable globale et juste appeler la variable dans le body du mail ?
encore merci pour le coup de main.
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 6 ans 9 mois #29031
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Boucle
asceltis écrit:

Mais, pour la maintenance, de dupliquer le code est à éviter.
Crée une fonction de recherche de fichier qui attend en paramètre une liste de fichier.
asceltis écrit:
Mais ici, après la maintenance la conception, il faut éviter de mélanger les traitements de génération de données avec ceux de présentation ( affichage de données formatées).
Si demain tu souhaites envoyer un pdf au lieu d'un message HTML tu seras obligé de tout modifier. Certes tu peux me répondre 'y a 3 lignes, ça va pas me faire mal aux mains'. On peut aussi procéder comme cela...
En gros tu devrais avoir ceci :
[code:1]$Files= @(
Get-Data ListeFichier1
Get-Data ListeFichier2
)
$Message=New-message $Files
Send-Mail $Message[/code:1]
Si ça fonctionne pourquoi pasest-ce correct ?
Mais, pour la maintenance, de dupliquer le code est à éviter.
Crée une fonction de recherche de fichier qui attend en paramètre une liste de fichier.
asceltis écrit:
Si c'est du texte formaté on peut procéder comme cela.juste appeler la variable dans le body du mail ?
Mais ici, après la maintenance la conception, il faut éviter de mélanger les traitements de génération de données avec ceux de présentation ( affichage de données formatées).
Si demain tu souhaites envoyer un pdf au lieu d'un message HTML tu seras obligé de tout modifier. Certes tu peux me répondre 'y a 3 lignes, ça va pas me faire mal aux mains'. On peut aussi procéder comme cela...
En gros tu devrais avoir ceci :
[code:1]$Files= @(
Get-Data ListeFichier1
Get-Data ListeFichier2
)
$Message=New-message $Files
Send-Mail $Message[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.052 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Boucle