1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
Function New-FilterDateFile([String] $PropertyName="CreationTime",[switch] $Force){
#
# Cette fonction crée un objet générateur de filtre de recherche,
# basé sur une propriété, de type date, de la classe System.IO.FileSystemInfo.
#
#Arguments :
# $PropertyName : Nom de la propriété contenant la date concernée lors la recherche
# Attention au respect de la casse !
#
# $Force : A utiliser si la propriété référence un membre synthétique
#
#
#Cette fonction renvoit un objet de type PSObject, ses membres sont :
# Méthodes (toutes renvoient un scriptblock pouvant être utilisé avec Where-Object) :
#
# ThisDate : Recherche les fichiers de la date spécifiée. Les deux opérandes sont de type String.
# Attend un argument de type string contenant une date au format Fr de type : "28/12/2009"
#
# TheseDates : Recherche les fichiers des dates spécifiées. Les deux opérandes sont de type String.
# Attend un argument de type string contenant une regex référençant des dates au format US : "(^10/07/2009|^10/31/2009)"
#
# AfterThisDate : Recherche les fichiers postérieurs ou égaux à la date spécifiée. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif ou zéro. Cf. Notes
#
# BeforeThisDate : Recherche les fichiers antérieurs la date spécifiée. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif ou zéro. Cf. Notes
#
# LastMinutes : Recherche les fichiers agés de n minutes. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif. Cf. Notes
#
# LastHours : Recherche les fichiers agés de n heures. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif. Cf. Notes
#
# LastMonths : Recherche les fichiers agés de n mois. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif. Cf. Notes
#
# LastYears : Recherche les fichiers agés de n années. Les deux opérandes sont de type DateTime.
# Attend un argument de type entier, négatif. Cf. Notes
#
# Combine : Crée un filtre contenant plusieurs clauses combinées avec l'opérateur -or
# Attend un argument de type tableau de scriptblock.
#
# Propriétés :
#
# Description : Contient le nom de la propriété utilisée dans la construction des filtres.
# Renvoi une chaîne de caractères.
#
# Exemples :
# $Filtre= New-FilterDateFile "CreationTime"
# #Filtre les fichiers d'il y a une semaine.
# $AfterThisDate=$Filtre.AfterThisDate(-7)
# $AfterThisDate #affiche le code du scriptblock
# Get-Childitem "$pwd"|Where $AfterThisDate|Select Name, "CreationTime"
#
# #Filtre les fichiers créés le 25 octobre 2009 et ceux créés le 31 octobre 2009
# $TheseDates=$Filtre.TheseDates("(^10/25/2009|^10/31/2009)")
# Get-Childitem "$pwd"|Where $TheseDates|Select Name,"CreationTime"
#
# $ThisDate=$Filtre.ThisDate("30/12/2009")
# #Filtre les fichiers créés :
# # Il y a une semaine,
# # le 25 octobre 2009 et ceux créés le 31 octobre 2009
# $FiltrePlusieursDates=$Filtre.Combine( @($AfterThisDate, $TheseDates))
# Get-Childitem "$pwd"|Where $FiltrePlusieursDates |Select Name,"CreationTime"
#
#Note:
# Suppose lors de la recherche que la date du PC est bien le jour calendaire courant.
if (!$Force)
{
#Vérifie si la propriété existe et est du type Date
$PropertyInfo=[System.IO.FileSystemInfo].GetMember($PropertyName)
if ($PropertyInfo.Count -eq 0)
{Throw "La propriété $PropertyName n'existe pas dans la classe System.IO.FileSystemInfo."}
elseif ($PropertyInfo[0].PropertyType -ne [System.DateTime])
{Throw "La propriété $PropertyName n'est pas du type [System.DateTime]."}
}
# Code généré "'{0:dd/MM/yyyy}' -f `$_.CreationTime -eq '$($Args[0])'"
# renvoi lors de l'appel {'{0:dd/MM/yyyy}' -f $_.CreationTime -eq '28/12/2009'}
$ThisDate="`$ExecutionContext.InvokeCommand.NewScriptBlock(`"'{0:dd/MM/yyyy}' -f ```$_."+$PropertyName+" -eq '`$(`$Args[0])'`")"
$CodeNSB="`$ExecutionContext.InvokeCommand.NewScriptBlock(`"```$_."+$PropertyName
# Code généré "`$_.LastWriteTime -match '$($Args[0])'"
# renvoi lors de l'appel {$_.LastWriteTime -match "(^10/07/2009|^10/31/2009)"}
#Convertion implicite de $PropertyName.
$TheseDates=$CodeNSB+" -match '`$(`$Args[0])'`")"
$AfterThisDate=$CodeNSB+" -ge [DateTime]::Today.Adddays(`$(`$Args[0]))`")"
$BeforeThisDate=$CodeNSB+" -lt [DateTime]::Today.Adddays(`$(`$Args[0]))`")"
$LastMinutes=$CodeNSB+" -ge [DateTime]::Now.AddMinutes(`$(`$Args[0]))`")"
$LastHours=$CodeNSB+" -ge [DateTime]::Now.AddHours(`$(`$Args[0]))`")"
$LastMonths=$CodeNSB+" -ge [DateTime]::Now.AddMonths(`$(`$Args[0]))`")"
$LastYears=$CodeNSB+" -ge [DateTime]::Now.AddYears(`$(`$Args[0]))`")"
#Construction dynamique du code de création de l'objet Filtre
$MakeFilter=@"
New-Object PSObject|
#Args[0] attend une string contenant une date au format Fr de type : "28/12/2009"
Add-Member ScriptMethod ThisDate -value {$ThisDate} -Passthru|
#Args[0] attend une string contenant une regex référençant des dates au format US : "(^10/07/2009|^10/31/2009)"
Add-Member ScriptMethod TheseDates -value {$TheseDates} -Passthru|
#Args[0] attend un entier négatif ou zéro.
Add-Member ScriptMethod AfterThisDate -value {$AfterThisDate} -Passthru|
#Args[0] attend un entier négatif ou zéro.
Add-Member ScriptMethod BeforeThisDate -value {$BeforeThisDate} -Passthru|
#Args[0] attend un entier négatif.
Add-Member ScriptMethod LastMinutes -value {$LastMinutes} -Passthru|
#Args[0] attend un entier négatif.
Add-Member ScriptMethod LastHours -value {$LastHours} -Passthru|
#Args[0] attend un entier négatif.
Add-Member ScriptMethod LastMonths -value {$LastMonths} -Passthru|
#Args[0] attend un entier négatif.
Add-Member ScriptMethod LastYears -value {$LastYears} -Passthru|
Add-Member ScriptMethod Combine -value {
`$ArraySB=`$Args[0] -as [String[]]
`$ArraySB=`$ArraySB|% {"(`$_)"}
`$OldOfs=`$Ofs
`$Ofs=" -or "
`$sb=`$ExecutionContext.InvokeCommand.NewScriptBlock("`$ArraySB")
`$ofs=`$OldOfs
`$sb
} -Passthru|
Add-Member ScriptProperty Description -Value {"Générateur de filtre de recherche sur la date ($PropertyName), à utiliser avec Where-Object."} -Passthru
"@
#Exécution du code de création de l'objet Filtre
Invoke-Expression $MakeFilter
} |
Partager