Question
listing d'un repertoire
- Sismic
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 4
- Remerciements reçus 0
Je viens de découvrir Ps et je le trouve génial !
Je commence a faire qq petit script mais j'ai un souci sur un de mes script: je veux lister le contenu d'un répertoire et envoyer ce listing dans un fichier.
Si je test un fois le fichier.ps1, tout est ok. Par contre si je recommence, PS m'indique que mon fichier contenant le listing est occupé par un autre process !
[code:1]
$analysepath=\"c:\windows\"
dir $analysepath | set-content c:\temp\monfichier.txt
[/code:1]
Le fichier .txt est envoyé par mail ensuite.
une idée ?
Connexion ou Créer un compte pour participer à la conversation.
- PASCAULT
- Hors Ligne
- Membre senior
- Messages : 78
- Remerciements reçus 0
Je ne vois pas de raisons particulière pour lesquelles cela ne fonctionnerait pas la 2eme fois. (Si ton script se limite à ces 2 ligne)
Toutefois, tu précises que tu envoies par mail... par script ? Ton fichier ne serait-il pas bloqué par un autre process alors ?
Connexion ou Créer un compte pour participer à la conversation.
- Sismic
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 4
- Remerciements reçus 0
[code:1]
$analysepath=\"c:\windows\"
dir $analysepath | set-content c:\temp\monfichier.txt
$date = [System.DateTime]::Now
$expediteur = \" Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. \"
$destinataire = \" Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. \"
$serveur = \"smtp.orange.fr\"
$fichier = \"c:\temp\monfichier.txt\"
$objet = \"Envoi de mail via powershell \" + $date
$texte = \"Compte rendu de sauvegarde du \" + $date
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
$attachment = new-object System.Net.Mail.Attachment $fichier
$message.Attachments.Add($attachment)
$client = new-object System.Net.Mail.SmtpClient $serveur
$client.Credentials = [System.Net.CredentialCache]::«»DefaultNetworkCredentials
$client.Send($message)
[/code:1]
je recois bien le mail.
Connexion ou Créer un compte pour participer à la conversation.
- Sismic
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 4
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Le process est bien PowerShell mais le verrouillage du fichier est du à un objet utilisé dans le script, à savoir $AttachementTon fichier ne serait-il pas bloqué par un autre process alors ?
Le fait de clore la session et de ré-exécuter le script fonctionne, il y a donc qq chose qui se passe entre les 2 sessions, je pense que c'est tout simplement la libération forcée de toutes les ressources utilisée par PS.
A partir de là on regarde du coté de .NET.
L'affection $attachment=$Null ne fonctionne pas car le Garbage Collector laisse la ressource (c'est à dire le handle de fichier [Api WIN32]) \"à moitié morte\".
Comme le GC ne libére la mémoire que si nécessaire, le handle est valide pendant ce temps là.
Donc la lecture du SDK sur l'objet manipulant le fichier nous indique ceci :
From : msdn2.microsoft.com/en-us/library/ms144637.aspx
Call Dispose when you are finished using the AttachmentBase. The Dispose method leaves the AttachmentBase in an unusable state. After calling Dispose, you must release all references to the AttachmentBase so the garbage collector can reclaim the memory that the AttachmentBase was occupying. For more information, see Cleaning Up Unmanaged Resources and Implementing a Dispose Method.
Le code suivant ne bloque plus la répétition de l'envoi (par prudence je dirais que c'est à confirmer) :
[code:1]$message = $null
$attachment.Dispose()
$client = $null[/code:1]
La méthode Dispose libère les ressource WIN32 utilisées par certaines instances de classe du framework .NET qui, rappelons-le, s'appui sur WIN32.
Voilà c'est plus un pb de dev spécifique .NET que de scripting sous PowerShell, là est le piége.
Même si ce n'est pas votre métier n'hésitez pas à lire la doc du SDK.NET, au moins celle liée aux méthodes que vous utilisez. Pour une fois qu'il existe une documentation conséquente
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Sismic
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 4
- Remerciements reçus 0
je sais bien que lire ces docs seraient un plus mais je ne suis pas du tout developpeur mais administrateur.
Mais je vais faire des efforts en ce sens promis
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- listing d'un repertoire