Question Sélectionner des fichiers en comparant la date de création

Plus d'informations
il y a 5 mois 3 semaines - il y a 5 mois 3 semaines #32339 par Chln
Bonjour à tous,
Je sollicite votre aide car dans le cadre d'un petit projet je souhaite copier des fichiers d'un répertoire A vers un répertoire B, étant débutant je bloque sur un point.

Ma contrainte est la suivante: sur le répertoire A sont déposé de temps en temps des fichiers (plusieurs sur un même journée et qui contient des fichiers de jours précédents), cependant je ne sais pas le jour exact de la dépose de ces fichiers.

J'ai donc commencé un début de script Powershell qui vient parcourir mon répertoire et récupérer la date de création du dernier fichier .xlsx créé avec un format de date choisi (qui ne contient pas l'heure de création).
$Select_File=Get-ChildItem "$Export\*.xlsx"|Sort-Object {$_.CreationTime} | select-Object -last 1 | select @{n='CreationTime';e={$_.CreationTime.ToString('dd/MM/yyyy')}}

Une fois cette valeur récupérée je voudrais la comparer à l'intégralité des fichiers du répertoire A afin de stocker dans une variable de type $File uniquement les fichiers qui ont été créés le même jour que ce derniers fichiers pour ensuite pouvoir les copier dans mon répertoire B.

C'est là que je bloque, j'ai essayé d'utiliser la ligne de code suivante pour sélectionner mes fichiers en utilisant un where{} mais cela ne fonctionne pas.
$File=Get-ChildItem "$Export\*.xlsx"|Sort-Object {$_.CreationTime} | where {$_.CreationTime -match $Select_File} | Select-Object

Pour information le paramètre "CreationTime" me ressort la valeur sous le format @{CreationTime=27/05/2022 01:56:02}
La ligne " select @{n='CreationTime';e={$_.CreationTime.ToString('dd/MM/yyyy')}} " me permet d'avoir un format @{CreationTime=27/05/2022}
Mon idée est donc de rechercher l'élément de date pour le faire matcher avec les fichiers que je veux récuper.

Edit: Il m'est impossible d'utiliser la date du jour, je dois uniquement utiliser la date de création du dernier fichier.

Voilà j'espère que quelqu'un pourra m'aider :).
Merci à tous.
Dernière édition: il y a 5 mois 3 semaines par Chln.

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

Plus d'informations
il y a 5 mois 3 semaines #32340 par Philippe
salut Chln

pour que le match fonctionne dans ton where il faut faire une comparaison avec une valeur chaine de caractère, hors ta variable $select_file est un tableau de chaine !

voici une solution :
$Select_File = $Select_File.CreationTime
$File = Get-ChildItem "$Export\*.xlsx" | Sort-Object {$_.CreationTime} | where {$_.CreationTime -match $Select_File} | Select-Object

voici une autre solution :
$File = Get-ChildItem "$Export\*.xlsx" | Sort-Object {$_.CreationTime} | where {$_.CreationTime -match $Select_File.CreationTime} | Select-Object
 

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

Plus d'informations
il y a 5 mois 3 semaines #32342 par Chln
Merci Philippe pour ta réponse.

Après test cela ne fonctionne pas, je pense que la problématique vient du fait que CreationTime renvoi une valeur sous ce format: @{CreationTime=02/06/2022 10:03:43} avec les heures minutes et secondes, cependant tous les fichiers ne sont pas créés exactement dans la même minutes ou la même heure, ce qui me rend impossible de faire matcher cette information. Il faudrait que je me base uniquement sur la date.

Une autre approche, j'ai essayé de tronquer le résultat de la date du dernier fichier créé au format 02/06/2022 dans une variable appelée "$Name_File_Split" afin de sélection de la manière suivante:
$File=Get-ChildItem "$Export\*.xlsx"|Sort-Object {$_.CreationTime} | where {$_.CreationTime -match $Name_File_Split} | Select-Object

Sans succès non plus.

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

Plus d'informations
il y a 5 mois 3 semaines - il y a 5 mois 3 semaines #32343 par Philippe
j'ai testé les deux précédentes solutions chez moi et elle fonctionne,

mais si on veux être logique, on doit comparer des choses identiques, soit dd/mm/aaaa avec dd/mm/aaaa
soit l'approche suivante :
$File = Get-ChildItem "$Export\*.xlsx" | Sort-Object {$_.CreationTime} | where {$_.CreationTime.ToString('dd/MM/yyyy') -match $Select_File} | Select-Object
Dernière édition: il y a 5 mois 3 semaines par Philippe.

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

Plus d'informations
il y a 5 mois 3 semaines - il y a 5 mois 3 semaines #32344 par Laurent Dardenne
salut,
qq remarques rapido :

>>Pour information le paramètre "CreationTime" me ressort la valeur sous le format @{CreationTime=27/05/2022 01:56:02}
C'est l'opérateur -match qui transforme le type date en format string , du coup $Select_File est un PSObject qui contient une propriété de type date. Ensuite pour la relecture autant nommer la variable avec une information de date (du genre $DateOfSelectedFile).

Le test de date à partir d'un format String est à éviter je pense. Que se passera-t-il sur un OS English ? Peut être rien, mais il faut le tester pour le savoir...

>>cependant tous les fichiers ne sont pas créés exactement dans la même minutes ou la même heure,
Ne pas hésiter à analyser le type manipulé :
$date=get-date
$date|select *
#en passant voir aussi
$c=get-culture
$c.DateTimeFormat|select *

Donc $Date.Date permet de filtrer sur le jour uniquement, la partie heure:minute sera identique pour tous.

Tutoriels PowerShell
Dernière édition: il y a 5 mois 3 semaines par Laurent Dardenne.

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

Plus d'informations
il y a 5 mois 3 semaines - il y a 5 mois 3 semaines #32353 par Chln
Bonjour,
Encore merci pour vos retours.

Après test je n'arrive toujours pas à sélectionner les fichiers du jour, voici ce que contient mon code:
$Select_File = Get-ChildItem "$Export"|Sort-Object {$_.LastWriteTime} | select-Object -last 1 | select @{n='LastWriteTime';e={$_.LastWriteTime.ToString('dd/MM/yyyy')}} Write-Host "1) Lastwritetime dernier fichier créé:"
$Select_File Get-ChildItem "$Export" | Sort-Object {$_.LastWriteTime} | where {$_.LastWriteTime.ToString('dd/MM/yyyy') -match $Select_File} | Select-Object Write-Host "3) Lastwritetime dernier fichier créé: "$File

Voici le résultat qui mes retourné:
1) Lastwritetime dernier fichier créé:  @{LastWriteTime=03/06/2022}
3) Lastwritetime dernier fichier créé:             

Si je retire mon Where{} je me retrouve bien avec l'intégralité des fichiers de mon répertoire, si je rajoute ce paramètre, aucun objet ne met retourné (donc aucune sélection).
Dernière édition: il y a 5 mois 3 semaines par Chln.

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

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