Question Surveillance répertoire et sous repertoires + mail

Plus d'informations
il y a 16 ans 2 mois #1499 par sonic
Bonjour,

On ma demandé de remonter par mail toutes modifications dans un repertoire et ses sous repertoires. Travaillant habituellement en bat, j'ai vite compris que j'avais pas fini. J'en ai donc profité pour me mettre a PowerShell.

Voici deja le code on vera mes problèmes ensuite.
PS: Ca ne fait meme pas une semaine que j'ai débuté avec PowerShell et ca se voi .......

[code:1]
cd \"C:\dev\rep de test\"
if (test-path c:\dev\mail.txt) {del c:\dev\mail.txt} else {}

# Je fait un état des lieux pour connaitre la date de derniere ecriture (modification) sur les fichiers (si l'ancien etat n'est pas dans le
# fichier) .
if (!(test-path c:\dev\etat.txt)) {

$avant= get-childitem -Recurse |Where-Object {$_.PSIsContainer -eq 0}| sort-object -descending -property lastWritetime |findstr /B /C:-a

# Une tempo fais avec ce que je connais de PS pour l'instant mais au moins ca focntionne très bien et consomme peu de ressource Facile a
# régler en secondes
# ping 127.0.0.1 -n 10
# Toutes la partie ci dessus n'est a faire que si le fichier de l'ancien état (etat.txt) est abscent .
}
else
{$avant=get-content c:\dev\etat.txt}
# ping 127.0.0.1 -n 300 tempo pour le premier lancement uniquement .
# cette fois on refait un état des lieux sur la date de mofi (création) des fichiers )
$apres= get-childitem -Recurse |Where-Object {$_.PSIsContainer -eq 0}| sort-object -descending -property lastWritetime |findstr /B /C:-a
# Fabrication du fichier etat.txt qui mémorise l'etat pour le prochain lancement (tache planifié)
echo $apres > c:\dev\etat.txt

# On compare le avant avec le apres et on le stoke dans la variable
$res= compare-object $avant -differenceobject $apres

# Si la variable $res est vide alors on fait rien sinon on envois les mail
if (!($res))
{
echo \"pas de modif\"
}
else
{
# On créé le fichier join et on l'envoi (oui ca fait 2 foi le meme compare mais je sais pas encore faire en 1)
compare-object $avant -differenceobject $apres > c:\dev\mail.txt
$varmail=get-content c:\dev\mail.txt
# j'enleve les entetes pour l'instant pour voir si ca décale moins le formatage du texte .
$texte2 = $varmail |findstr /B /C:-a
$expediteur = \" expediteur@host.com\"
$destinataire = \" moa@abc.fr\"
$serveur = \"monserv\"
$fichier = \"c:\dev\mail.txt\"
$objet = \"Fichiers modifiés \" + [System.DateTime]::Now
$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte2
$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)

}
cd \dev
if (test-path c:\dev\mail.txt) {del c:\dev\mail.txt} else {}[/code:1]

Ca liste bien les modifs s'il en a, seule la partie mail pose souci. Les perfs son acceptables : 25 secondes le scan de 14 Go sur un poste de travail standard. Dommage que j'arrive pas a envoyer dans le corp du mail ce que l'ecran me donne en copier/coller du compare dans la console.

1er probleme : Au premier lancement ca fonctionne puis ensuite j'ai un message qui me dit :

[code:1]Remove-Item : Impossible de supprimer l'élément C:\dev\mail.txt : Le processus ne peut pas accéder au fichier 'C:\dev\mail.txt', car il est en cours d'utilisation par un autre processus.[/code:1]
Je comprends pas pourquoi !!!! (je vais peut etre avoir la reponse dans un autre post sur ce site)

2 eme problème: Le format du corps du mail ne me convient pas et je voudrais le travailler pour avoir par exemple \"date heure de modif taille nom (plus de place pour les noms de fichiers) et sens des modifs (ou je l'enlève) \" j'ai pas vraiment besoin de -a--- . Deplus, le fichier joint est presque bon parcontre le corp du mail lui varie a tous les coups en fonction de la longeur des données. A terme je n'enverais pas le fichier joint sauf si je ne trouve pas d'autre solution. Je fais les 2 pour tester.

3 ieme probléme: je raisonne encore en cmd (bat) alors je suis sur que on doit pouvoir faire mieux ,il n'y a qu'a voir findstr je pense que PS a son outil voir une autre méthode.

Bref si il le faut je re-ecris tout.
J'ai mis une capture d'ecran qui montre le fichier joint et le corps du mail.

Je voulais adapter ce script trouvé a l'adresse ci-dessous car il me parait beaucoup mieux mais je n'ai pas a l'heure actuelle le niveau pour le faire, ce sera pour plus tard. J'ai essayer, c'est un peu tot je pense.
powershell-scripting.com/index.php?optio...id=129&Itemid=71

Je suis preneur de toutes aides et toutes remarques.
(pas réussi à mettre l'image)

merci d'avance.

Message édité par: sonic31, à: 17/01/08 17:24<br><br>Message édité par: Arnaud, à: 17/01/08 19:59
Pièces jointes :

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

Plus d'informations
il y a 16 ans 2 mois #1503 par Arnaud Petitjean
Bonsoir Sonic et bienvenue dans la commauté francophone PowerShell :)

Ton problème est très similaire à celui de Jeelou, attendons de voir comment elle va le résoudre.

Concernant ton code, je te suggère d'éviter d'utiliser les alias \&quot;hérités\&quot; du genre del, cd, etc. Comme ça tu te familiariseras plus vite avec PowerShell.
De plus il vaut mieux éviter de mixer, dans la mesure du possible, des commandes PowerShell avec des \&quot;commandes CMD\&quot;. Cela uniquement dans le but d'avoir un code homogène.

Sinon, pour ton information le pendant de FindStr en PS est Select-String.

A bientôt,

Arnaud
PS: Les dimensions max d'une images pour poster dans le forum sont de 1024x768 50Ko. Il serait intéressant que tu la postes pour que l'on puisse se rendre compte de ce qui ne va pas.<br><br>Message édité par: Arnaud, à: 17/01/08 23:13

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 2 mois #1507 par sonic
Merci bien pour ces conseils c'est tout à fait ce dont j'ai besoin . Je vais donc deja m'atteller à transcrire est a n'utiliser que du powershell car je suis d'accord avec toi , c'est plus propore , plus homogéne Si je le fait pas je m'habiturais jamais . Je vais commencer par findstr .....
Pour le reste je vais re essayer de publier l'image ce matin et attendre pour l'autre problème qui je vois est assez incompréhensible vu le post de jeeloo .
J'ai un peu de mal parfois à trouver une aide .Par exemple j'ai pas su trouver la syntaxe de if (et surtout \&quot;if not\&quot; autrement qu'en explorant des exemples ici. Pareil pour les objets donc c'est long a apprendre(Pour les commandes ok ) mais je lacherais pas .
Aller je reprend l'exploration .
je retente l'image ....


cool ca fonctionne. Alors la partie en haut c'est le corp du mail et en bas ce que j'ai dans le fichier joint. Ce que je voudrais arriver a faire c'est à avoir dans le corp du mail ce que j'ai dans le fichier joint sans la colonne \&quot;input objet\&quot; mais avec plus de place pour le nom des fichiers .<br><br>Message édité par: sonic31, à: 18/01/08 09:59
Pièces jointes :

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

Plus d'informations
il y a 16 ans 2 mois #1508 par sonic
Bon ben ca ne s'arrange pas ....
Maintenant on me dit qu'il faudrait le chemin des fichiers modifiers ou du moins le dossier ou ils se trouvent, ce qui est presque pareil .
:blink: ca se complique .

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

Plus d'informations
il y a 16 ans 2 mois #1539 par sonic
Voici l'avancement de mon petit projet .

[code:1]
$tempo = 10
$derniercheck = get-date
$rep =\&quot;c:\repsurveille\\&quot;
$fichierenvoie = \&quot;d:\mail.txt\&quot;
$ancien = get-childitem $rep -r

while ($derniercheck -ne $null)
{
start-sleep -s $tempo
$actuel = get-childitem $rep -r

\&quot;fichiers modifiés\&quot;
$a=$actuel |where {($_.lastwritetime -gt $derniercheck)-and($_.creationtime -lt $derniercheck)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders

\&quot;fichiers crees\&quot;
$b=$actuel |where {($_.creationtime -gt $derniercheck)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders

\&quot;fichiers renomés\&quot;
$c=$actuel | where {(($ancien | foreach {$_.name}) -notcontains $_.name)-and ($_.creationtime -lt $derniercheck)}|
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders

\&quot;fichiers supprimés\&quot;
$d=$ancien |where {((get-childitem $rep -r $_) -eq $null)} |
format-table Lastwritetime, Length, name, directoryname -autosize -hideTableHeaders



$test=$a,$b,$c,$d
$texte=\&quot;fichiers modifiés\&quot; ,$a,\&quot;fichiers crees\&quot; ,$b,\&quot;fichiers renomés\&quot; ,$c,\&quot;fichiers supprimés\&quot; ,$d

if ($test -ne $nul) {
$texte&gt;c:\dev\a.txt
$texte2=get-content c:\dev\a.txt
$expediteur = \&quot; expediteur@host.com\&quot;
$destinataire = \&quot; destinat@toto.fr\&quot;
$serveur = \&quot;svrsmtp\&quot;
# $fichier = \&quot;c:\temp\monfichier.txt\&quot;
$objet = \&quot;Envoi de mail via powershell \&quot; + [System.DateTime]::Now
$texte3=\&quot;$texte2\&quot;

$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte2

# $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)
}
$ancien = $actuel
$derniercheck = get-date

}[/code:1]
Voila ca fonctionne mais le mail est moche .
La sortie a l'ecrant et/ou dans un fichier est bonne mais dans le corp du mail il me met tout en ligne , tout a la suite . La faute certainemnt a l'encodage different dans le client messagerie .
Pour l'instant je vois pas trop comment faire . Je supose que ici quelqu'un me montrera le chemin .<br><br>Message édité par: Arnaud, à: 22/01/08 17:47

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

Plus d'informations
il y a 16 ans 2 mois #1545 par maycry
ah oui je connaiss aussi cette soufrance, le contenut d'un fichier il te le sort tout à la ligne
saloprie de powershell,en VBS il me le sort niquel.

j'ai du me l'envoyer en piéce jointe le temps de trouver uen solution.

zolie script

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

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