Question listing d'un repertoire

Plus d'informations
il y a 16 ans 1 mois #1922 par Sismic
listing d'un repertoire a été créé par Sismic
Bonjour à tous !

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.

Plus d'informations
il y a 16 ans 1 mois #1923 par PASCAULT
Réponse de PASCAULT sur le sujet Re:listing d'un repertoire
Slt,

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.

Plus d'informations
il y a 16 ans 1 mois #1924 par Sismic
Réponse de Sismic sur le sujet Re:listing d'un repertoire
allez le code complet !

[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.

Plus d'informations
il y a 16 ans 1 mois #1925 par Sismic
Réponse de Sismic sur le sujet Re:listing d'un repertoire
han j'aurais du plus fouiller c'est le meme probleme qu'ici powershell-scripting.com/index.php?optio...;id=1491&catid=5

:S

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

Plus d'informations
il y a 16 ans 1 mois #1932 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:listing d'un repertoire
gremlinsy écrit:

Ton fichier ne serait-il pas bloqué par un autre process alors ?

Le process est bien PowerShell mais le verrouillage du fichier est du à un objet utilisé dans le script, à savoir $Attachement

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.

Plus d'informations
il y a 16 ans 1 mois #1935 par Sismic
Réponse de Sismic sur le sujet Re:listing d'un repertoire
Fantastique cela fonctionne !!

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 :laugh:

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

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