90 votes

Powershell Get-ChildItem fichier le plus récent dans le répertoire

Nous produisons des fichiers avec la date dans le nom. (* ci-dessous est le caractère générique pour la date) Je veux récupérer le dernier fichier et le dossier qui contient également la date (mois seulement) dans son titre.

Je utilise PowerShell et je le programme pour qu'il s'exécute chaque jour. Voici le script jusqu'à présent:

  $LastFile = *_DailyFile
  $compareDate = (Get-Date).AddDays(-1)
  $LastFileCaptured = Get-ChildItem -Recurse | Where-Object {$LastFile.LastWriteTime        
         -ge $compareDate}

192voto

manojlds Points 96599

Si vous voulez le dernier fichier dans le répertoire et que vous utilisez uniquement le LastWriteTime pour déterminer le dernier fichier, vous pouvez faire quelque chose comme ci-dessous :

gci chemin | sort LastWriteTime | select -last 1

En revanche, si vous voulez vous fier uniquement aux noms qui contiennent les dates, vous devriez pouvoir faire quelque chose de similaire

gci chemin | select -last 1

Aussi, s'il y a des répertoires dans le répertoire, vous voudrez peut-être ajouter un ?{-not $_.PsIsContainer}

0 votes

@user977645 n'oubliez pas d'accepter cette réponse en cliquant sur le signe de vérification à gauche sous la flèche pour voter en haut/bas.

0 votes

Il y a une rumeur sur Internet selon laquelle "LastAccessTime" fonctionne pour cela. C'est un mensonge. Votre solution est la bonne.

0 votes

Pour le premier fichier: | trier LastWriteTime | sélectionner -premier 1

6voto

Brian Russell Points 31

Oui je pense que cela serait plus rapide.

Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime -Top 1

2 votes

J'aime l'idée de trier dans l'ordre décroissant, puis de prendre le premier résultat. Selon le fonctionnement en arrière-plan, cela pourrait être plus rapide sur un grand répertoire. Mais vous devez rediriger vers Select. De plus, Top n'est pas valide. Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime | Select -First 1

0 votes

Oui, c'est de ma faute, -Top n'a été introduit que dans PowerShell 6

2voto

user3198983 Points 11

La réponse de @manojlds est probablement la meilleure pour le scénario où vous vous intéressez uniquement aux fichiers dans un répertoire racine :

\chemin
     \fichier1
     \fichier2
     \fichier3

Cependant, si les fichiers qui vous intéressent font partie d'un arbre de fichiers et de répertoires, comme :

\chemin
     \fichier1
     \fichier2
     \dossier1
         \fichier3
         \dossier2
              \fichier4

Pour trouver, de manière récursive, la liste des 10 fichiers les plus récemment modifiés sous Windows, vous pouvez exécuter :

PS > $Chemin = pwd # votre répertoire racine
PS > $Enfants = Get-ChildItem $Chemin -Recurse -File
PS > $Enfants | Sort-Object LastWriteTime -Descending | Select-Object -First 10 FullName, LastWriteTime

0 votes

Cela a fonctionné pour moi lorsque j'ai essayé de savoir si une bibliothèque SharePoint avec beaucoup de dossiers était utilisée activement. Pour utiliser le script, j'ai dû ouvrir la bibliothèque dans l'explorateur de fichiers avec IE, retourner à la racine du site, cliquer une fois sur le dossier de la bibliothèque, dans l'onglet Accueil du ruban -> Copier le chemin

2voto

Blevblev Points 21

Vous pourriez essayer de trier par ordre décroissant "sort LastWriteTime -Descending" puis "select -first 1." Je ne suis pas sûr lequel est le plus rapide

1voto

Kent Pawar Points 600

Essayer :

$latest = (Get-ChildItem -Attributes !Directory | Sort-Object -Descending -Property LastWriteTime | select -First 1)
$latest_filename = $latest.Name 

Explication :

PS C:\Temp> Get-ChildItem -Attributes !Directory *.txt | Sort-Object -Descending -Property LastWriteTime | select -First 1

    Répertoire : C:\Temp

Mode                LastWriteTime         Length Name                                                                                
----                -------------         ------ ----                                                                                
-a----         5/7/2021   5:51 PM           1802 Prison_Mike_autobiography.txt                    
  • Get-ChildItem -Attributes !Directory *.txt or Get-ChildItem or gci : Obtient la liste des fichiers uniquement dans le répertoire actuel. Nous pouvons également spécifier un filtre d'extension de fichier si nécessaire comme *.txt. Référence : gci, Get-ChildItem
  • Sort-Object -Descending -Property LastWriteTime : Trie les fichiers par LastWriteTime (heure de modification) dans l'ordre décroissant. Référence
  • select -First 1 : Obtient le premier/enregistrement supérieur. Référence : Select-Object / select

Obtention des métadonnées du fichier

PS C:\Temp> $latest.Name
Prison_Mike_autobiography.txt

PS C:\Temp> $latest.DirectoryName
C:\Temp

PS C:\Temp> $latest.FullName
C:\Temp\Prison_Mike_autobiography.txt

PS C:\Temp> $latest.CreationTime
Vendredi 7 mai 2021 17:51:19

PS C:\Temp> $latest.Mode
-a----

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X