parcours et suppression de fichiers [RESOLU][PowerShell 1.0] - Shell/Batch - Programmation
Marsh Posté le 29-01-2009 à 17:49:35
Bon à priori je suis parti sur la mauvaise pente... Adapter depuis un VBS c'est le mal.
Donc j'ai trouvé un script et l'ai adapté.
Le voici :
|
Qui fonctionne bien
Reste à adapter le reste
Marsh Posté le 30-01-2009 à 09:05:16
trouvé pour la fonction log. Super Simple :
Start-Transcript -path chemin.log
permet de loguer tout ce qui s'affiche dans powershell tant qu'on ne l'arrête pas.
On l'arrête avec la commande :
Stop-Transcript
Voici mon script... Avec à la fin la fonction mail :
|
Sauf que pour l'instant la fonction mail arrive pas a envoyer le mail... Je subodore un problème de mauvaise passerelle SMTP.
Marsh Posté le 30-01-2009 à 09:26:17
C'était bien ça, me suis lamentablement gourré dans mon adresse de serveur mail
Mon script fonctionne de A à Z ...
Reste une dernière question :
Comment est-ce que je peux faire pour loguer sans écrasement ???
La fonction start transcript crée un fichier de log, et si on relance la même fonction avec le même fichier (ce qui est le cas dans mon script) il recrée le fichier... Donc pas d'historique.
Des idées ?
Marsh Posté le 30-01-2009 à 13:53:37
Petit Up...
Marsh Posté le 02-02-2009 à 15:57:30
Problème résolu, j'ai mis en premier post le source résultant.
Marsh Posté le 29-01-2009 à 16:46:59
Bon Problème résolu. Je met le script en guise de source.
#==========================================================================
#~~[comment]~~
#AUTEUR : NixNBK
#Ce Script Permet de supprimer des fichiers vieux de plus de X jours dans une arborescence de fichiers
#Le script fonctionne avec 3 arguments :
#1er Argument : Chemin du répertoire à scanner
#2e Argument : Nombre de jours
#3e Argument : Chemin du répertoire de log
#La commande s'ecrit donc : .\scriptsupprfichier.ps1 "X:\repertoire_scan" 10 "X:\repertoirelog"
#Attention à ne pas mettre pour le répertoire de log un anti-slash à la fin. Le script le fait déjà.
#Les logs sont au format :suppression_log_AAAA-MM-JJ.log
#Il faut modifier certains paramètres du script, notemment dans la partie mail, ou le serveur mail, l'expediteur
#et le destinataire sont à mettre à jour.
#~~[/comment]~~
#==========================================================================
$cheminlog=$args[2]
$datejour=get-date -uformat "%Y-%m-%d"
$fichierlog=$args[2]+"\suppression_log_"+$datejour+".log"
#==========================================================================
# SETTING 0 : Démarrage du log
#==========================================================================
Start-Transcript -path $fichierlog
#==========================================================================
# SETTING 1 : Le répertoire à scanner.
#==========================================================================
$mydata = $args[0]
#==========================================================================
# SETTING 2 : Nombre de jours
#==========================================================================
$day = $args[1]
#==========================================================================
# SCRIPT SUPPRESSION :
#==========================================================================
if (Test-Path $mydata)
{
Write-host "Le répertoire scruté est :" $mydata -foregroundcolor "Red"
Write-Host "Il est encore temps d'annuler (vous avez 5 secondes), Pressez 'Ctrl + C' pour quitter" -foregroundcolor "Yellow"
Start-sleep -s 5
$jour = Get-Date
$lastmod = $jour.AddDays(-$day)
write-host $jour
write-host $lastmod
$Files = get-childitem $mydata -include *.* -recurse |Where {$_.LastWriteTime -le "$lastmod"}
foreach ($File in $Files)
{
write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
}
}
Else
{
Write-Host "Le Repertoire $mydata n'existe pas !"
}
#==========================================================================
# SETTING 3 : Arrêt du log
#==========================================================================
Stop-Transcript
#==========================================================================
# SETTINGS ENVOI DU MAIL : Les répertoires à scanner.
#==========================================================================
$expediteur = "expediteur@mail.fr"
$destinataire = "destinataire@mail.fr"
$serveur = "serveursmtp.fr"
$fichier = $fichierlog
$objet = "suppression de fichiers " + [System.DateTime]::Now
$texte = "Vous trouverez en fichier joint le fichier de log spécifiant les objets supprimés par le script"
#==========================================================================
# SCRIPT ENVOI DU MAIL : Les répertoires à scanner.
#==========================================================================
$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)
#==========================================================================
# FIN DU SCRIPT
#==========================================================================
****************************************************************************
****************************************************************************
Bonjour,
Je suis en train de réaliser un script PowerShell qui parcours une arborescence de fichier, et qui les supprime si la date de dernière modification est ultérieure à X jours.
Je souhaite également loguer une ligne par fichier supprimé.
Le truc c'est que je connais peu le langage powershell. Mais j'avais déjà adapté un script qui a la même fonction en VBS.
J'ai trouvé un document microsoft permettant de faire la transition VBS vers Powershell, mais c'est pas si évident que ça.
Voici en gros mon VBS :
If Wscript.Arguments.Count = 0 Then
Quantity = 1
redim MyData(Quantity)
MyData(1) = "D:\rep1\rep2" 'repertoire à parcourir
Else
redim MyData(1)
MyData(1) = Wscript.Arguments(0) 'was initiated by dropping folder on it
Quantity = 1
End If
'chemin fichier log
BackupLogFile = "D:\scripts\deletelog.txt"
'mail
blnLogMail=true
strMailFrom="xxx@xxx.fr"
strMailTo="yyyy@xxx.fr"
strMailSubject="[ serveur ] Delete Report"
strMailSubjectError="[ serveur ] Delete Report - ERROR"
strMailSMTPServer="123.123.123.1"
'script
set fso = CreateObject("Scripting.FileSystemObject" )
strScript = WScript.ScriptFullName
strScript = fso.GetFileName( strScript )
strScript = left( strScript, len(strScript) - 4 )
count = 0
dim arrResults ' vecteur qui stocke les resultats
redim arrResults(0)
For i = 1 to Quantity
If MyData(i) <> "" then
if fso.DriveExists( MyData(i) ) Then
call Delete( MyData(i) )
elseif fso.folderExists(MyData(i)) then
call Delete( MyData(i) )
elseif fso.fileExists(MyData(i)) then
call Filedelete( MyData(i) )
else
strMsg = MyData(i) & vbcrlf & vbcrlf & "Le fichier ou chemin n'existe pas" & _
vbcrlf & "Vérifiez que vous avez correctement tapé le chemin"
strMailSubject=strMailSubjectError
SendMail(strMsg)
WScript.Quit
end if
End If
Next
strlog = "----------------------" & vbnewline & "suppression de" & now() & vbnewline
strlog = strlog & join(arrResults, vbnewline) & vbnewline & "= " & count & "fichiers supprimés" & BackupPath & vbnewline & vbnewline
call logresults ( strlog )
' ----- envoi du mail
SendMail(strlog)
' ----- Reset Objet
set fso = nothing
wscript.quit
'-------------------------------------------------------
'Performes the actual copying if required
Sub Delete( mypath )
Set fldr = fso.GetFolder( myPath )
For Each f in fldr.Files
DoEvents
if DateDiff("d",fso.GetFile(f).DateLastModified,date() ) > 30 then
count = count + 1
ReDim Preserve arrResults(count)
arrResults(count) = f
fso.DeleteFile f, true
end if
DoEvents
Next
For Each Folder In fldr.SubFolders
Call Delete(Folder)
Next
End Sub
'-----------------------------------------------------------------
'performs the actual copying of Files if the path was a file - not folder
Sub Filedelete( myFile )
set f = fso.GetFile( myFile )
if DateDiff("d",fso.GetFile(f).DateLastModified,date() ) > 30 then
count = count + 1
ReDim Preserve arrResults(count)
arrResults(count) = f
fso.DeleteFile f, true
end if
End Sub
'----------------------------------------------------------------
'Fonction log
Sub LogResults( myText )
myfile = BackupLogFile
Set fso = CreateObject("Scripting.FileSystemObject" )
OutFile = "C:\#temp#.txt"
set textstream = fso.OpenTextFile(myFile,1,true)
Set OutStream=fso.CreateTextFile(OutFile,True)
OutStream.WriteLine( mytext )
Do until textstream.AtEndOfStream
OneLine = textstream.ReadLine
OutStream.WriteLine(oneline)
if instr(Oneline, "----------" ) then
logcount = logcount + 1
if logcount >= 5 then
exit do
end if
end if
Loop
textstream.close
OutStream.Close
fso.CopyFile OutFile, myfile, true
fso.DeleteFile OutFile
End Sub
'-------------------------------------------------------------------
Sub DoEvents
On error resume next
wscript.sleep 1 'milliseconds
End Sub
'-------------------------------------------------------------------
' Fonction mail
Sub SendMail(strMessage)
If blnLogMail Then
Set objMail= WScript.CreateObject("CDO.Message" )
With objMail
.From = strMailFrom
.To = strMailTo
.Subject = strMailSubject
.TextBody = CStr("" & strMessage)
.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing" ) = 2
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver" ) = strMailSMTPServer
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport" ) = 25
.Configuration.Fields.Update
.Send
End With
SET objMail = Nothing
End If
End Sub
Comme je dis c'est un script qui à la base était utilisé pour copier des messages, je l'ai récupéré et adapté pour les supprimer.
Et voici ce que ça donne pour l'instant en Powershell :
$mydata = "C:\repertoire1\repertoire2"
# au cas ou l'on rajoute un répertoire :
#$mydata = $mydata + "C:\repertoire3"
$backuplogfile="C:\scripts\deletelog.log"
$logmail = true
$strMailFrom="deletefiles@chu-grenoble.fr"
$strMailTo="nlecertisseur@chu-grenoble.fr"
$strMailSubject="[ Serveur ] Rapport de suppresion"
$strMailSubjectError="[ Serveur ] Rapport de suppresion - ERREUR"
$strMailSMTPServer="@IP du SMTP a mettre"
# SCRIPT :
#Creation de l'objet COM
$obj = new-object -comobject scripting.filesystemobject
#Galère
For ($i = 1;$i -le $mydata.length;$i++)
{
#Galère
Voila ou j'en suis .
J'essaie de traduire comme je peux, mais j'ai quelques soucis pour ceci déja :
strScript = WScript.ScriptFullName
strScript = fso.GetFileName( strScript )
strScript = left( strScript, len(strScript) - 4 )
J'arrive pas trop à piger a quoi ça sert...
Bref si vous avez des idées, l'aide est la bienvenue
Message édité par nixnbk le 02-02-2009 à 15:57:02
---------------
I'll feed your skin snacks to my cockatiel!