Savoir si le fichier est âgé de plus de 4 heures dans un fichier de commandes
Tout simplement, comment pourrais-je savoir si un fichier dans un dossier est âgé de plus de X heures?
Le nom de fichier et l'emplacement sera toujours le même.
Grâce
OriginalL'auteur user270370 | 2011-08-03
Vous devez vous connecter pour publier un commentaire.
Sur la comparaison des temps de fichiers avec code de lot suivants doivent être pris en compte:
1. Format de Date et heure paramètres
Il y a les variables d'environnement DATE et TEMPS qui sur l'accès (et non pas sur le début de l'exécution du lot) retour actuel de la date et de l'heure dans un format selon Région Windows et les paramètres de Langue. Le pays définit le format de date et heure.
Il est même possible de définir par exemple pour l'allemand format de date courte avec
DD.MM.YYYY
(jour et mois avec zéro) et format de l'heure avecHH:mm:ss
(format 24 heures avec zéro pour l'heure, minute et seconde). Mais cela ne signifie pas que la valeur de DATE et TEMPS sont vraiment à l'aide de ce format. Par exemple TEMPS est en formatH:mm:ss,ms
quand après avoir sélectionné un allemand, même avecHH:mm:ss
définies, ce qui signifie pas de zéro sur l'heure, mais sur la minute et la seconde, et, en outre millisecondes après une virgule dans le temps de chaîne. La chaîne de date peut être aussi avec ou sans jour de la semaine selon les paramètres de région.Et il est le modèle
%~t
pour obtenir la dernière date de modification et le temps d'un répertoire ou d'un fichier. Exécuter dans une fenêtre d'invite de commandecall /?
etfor /?
et de lire toutes les pages d'aide affiché pour ces deux commandes pour plus de détails. Le format de la date et de l'heure chaîne de caractères retournée par%~t
ainsi affiché sur la sortie de commande DIR dépend aussi de Windows, les paramètres de région, mais n'est généralement pas égale le format des variables DATE et TEMPS. L'heure de la dernière modification d'un fichier ou d'un répertoire est généralement retournée sans deuxième valeur dans la chaîne de date/heure.Mieux est de trouver avec fichier de commandes suivant les meilleures exécutée avant 10:00 AM quels sont les formats actuels de la machine pour l'utilisateur courant.
2. Système de fichiers des supports de stockage
Sur les systèmes de fichiers Windows deux formats de stockage sont utilisés pour les fichier fois:
Sur un support de stockage à l'aide de NTFS la NTFS précision le temps est utilisé qui est un 64-bit nombre d'intervalles de 100 nanosecondes qui se sont écoulées depuis le 12:00 A. M. le 1er janvier 1601 Temps Universel Coordonné (UTC).
Sur un support de stockage à l'aide de FAT, FAT16, FAT32 ou exFAT le temps de fichiers sont stockés à l'aide de DOS de Date de Temps format avec deux valeurs de 16 bits avec une résolution de 2 secondes et à l'aide de l'heure locale actuelle.
Cela signifie une drôle de seconde n'est pas possible pour un fichier sur le GRAS des médias, mais sur le média NTFS. Copie d'un fichier sur un lecteur NTFS avec un étrange deuxième à la date de dernière modification d'un lecteur FAT32 résultats en avoir les fichiers identiques avec 1 seconde de différence dans la date de dernière modification.
Le temps de fichiers NTFS médias sont stockés au format UTC. Donc, ce qui est retourné par
%~t
ou commande DIR ainsi que ce qui est affiché par exemple dans l'Explorateur Windows dépendChanger un de ces 4 paramètres en résulte un changement immédiat de TOUTES les heures de fichier de fichiers et de répertoires sur le système NTFS de stockage de médias.
Fichier fois sur la GRAISSE médias sont plus ou moins constant que l'utilisation de l'heure locale sur la création, la modification ou de dernier accès, mais lisez la suite pour plus de détails.
3. Fuseau horaire, heure d'été
Comme temps de fichiers NTFS médias sont stockés au format UTC, mais à l'heure locale, le fuseau horaire et l'heure d'été pour cette zone sont importants pour le fichier de comparaisons temps, surtout quand fait pour les fichiers NTFS et FAT32 lecteurs.
Mais aussi pour les fichiers sur un GRAS des médias, le fuseau horaire et l'heure avancée paramètres pourrait être important en fonction de la version de Windows. Lire ci-dessous pour plus de détails.
4. Réglage automatique de l'heure d'été
Il y a le paramètre de réglage automatique de l'heure d'été qui devient important lors de l'activation par défaut et actuellement fuseau horaire définit l'heure d'été réglage.
Par exemple l'heure d'été est active actuellement en Europe. La désactivation de cette option dans les réglages de l'horloge de Windows en résulte un changement immédiat de l'affichage des temps de fichiers NTFS médias par -1 heure, et aussi beaucoup de fichiers sur le GRAS des médias en fonction de la version de Windows.
Cette 1 heure de différence résultant de l'heure le réglage doit être pris en compte sur la comparaison des temps de fichiers NTFS et FAT médias.
5. La Version de Windows
NTFS sont pris en charge par toutes les versions de Windows NT. Fichier fois le comportement est le même pour les fichiers et les répertoires sur toutes les versions de Windows de soutien NTFS.
Mais comment fichier fois sur le GRAS des médias sont interprétés en fonction de la version de Windows. Avant Windows Vista, le fichier fois sur le GRAS des médias sont indépendants sur le changement de fuseau horaire, heure d'été réglage et d'ajustement automatique de l'heure d'été. Dernière modification date/heure d'un fichier est constante sur Windows 2000 et Windows XP.
Mais sur Windows Vista et les versions ultérieures le fichier affichée fois sur le GRAS des médias dépendent de l'heure d'été et réglage automatique de l'heure d'été. Le fuseau horaire n'est pas directement en question. La sélection d'un autre fuseau horaire que celui actuellement utilisé ne permet pas de modifier le fichier affichée fois des fichiers sur le GRAS des médias comme il le fait pour les fichiers de NTFS médias. Mais si l'heure actuelle est à l'intérieur de l'heure d'été période de l'actif de fuseau horaire et le réglage automatique de l'heure d'été est activée et que l'heure locale du fichier ou le répertoire est à l'intérieur de l'heure d'été période, +1 heure, on ajoute par Windows Vista et les versions ultérieures. Les fichiers de la dernière modification sur les lecteurs FAT dans le temps standard sont constants au cours de l'année; seulement les fichiers de la dernière modification au sein de période d'heure d'été sont affichés avec ou sans +1 heure en fonction de l'heure est activé automatique de l'heure d'été réglage.
Que les différents fichiers FAT la gestion du temps peut être extrêmement déroutant lorsque, ayant par exemple un partage public d'un dossier sur un lecteur FAT32 sur une machine Windows 7 et étant connecté à ce dossier public avec une machine Windows XP. Un fichier de la dernière modification sur 2015-09-19 17:39:08 stockées sur le lecteur FAT32 sur PC Windows 7 est affichée aujourd'hui par Windows 7 avec l'allemand fuseau horaire avec l'heure du fichier 19.09.2015 17:39:08, mais dans 2 mois, mais pas modifié avec 19.09.2015 16:39:08, et Windows XP affiche même fichier connecté sur PC Windows 7 aujourd'hui et à l'avenir constante de temps du fichier 19.09.2015 17:39:08.
Comparant les temps de fichiers de fichiers stockés dans les archives (ZIP, RAR, ...) avec des fichiers NTFS ou FAT médias peut être vraiment un cauchemar.
6. En comparant l'heure du fichier avec l'heure actuelle
Pour cette tâche en comparant la date de dernière modification d'un fichier à l'heure actuelle, il devrait être suffisant de prendre date et de l'heure format de paramètres en compte.
Le lot code ci-dessous utilise le code est expliqué en détail dans ma réponse sur Lot de fichiers pour supprimer les fichiers de plus de N jours. Cette explication doit être lu avant d'utiliser le code ci-dessous.
En fonction de la date/heure format de l'variables DATE et TEMPS et la date/heure de chaîne de caractères retournée par
%~tI
pour les fichiers locaux de PC sous Windows, il pourrait être nécessaire d'apporter de petites modifications au code. Approprié conseils sont donnés dans le commentaire des lignes de code de lot.rojo ajout d'informations sur la date et l'heure de paramètres du format, fichiers système et la version de Windows peut être ignoré par l'aide de wmic - Windows Management Instrumentation utilitaire de ligne de commande.
À l'aide de wmic a l'avantage de format fixe la date et l'heure des chaînes et donc le lot code fonctionne sur tous les ordinateurs Windows sans adaptations locales format de date/heure.
Aussi la version de Windows n'a pas d'importance sur l'utilisation de wmic en raison de l'usage interne de GetFileTime fonction (le plus probable).
Le système de fichiers est seulement important sur l'évaluation de la également à quelques minutes de décalage de l'heure locale /heure du fichier à UTC. Commande wmic retourne sur les lecteurs FAT juste
+***
pour les minutes de décalage UTC alors que les minutes de décalage est correct pour la dernière modification du fichier d'un fichier sur un lecteur NTFS.Exemple pour le même fichier sur une partition NTFS ou FAT32 disque:
+120 est la somme de +60 minutes pour CET (Heure d'europe Centrale) et +de 60 minutes pour les actifs de l'heure d'été, ou en d'autres mots +120 minutes pour CEST (Central European Summer Time).
Par conséquent, le code du lot ci-dessous n'est pas d'évaluer les minutes de décalage à l'UTC qui n'est pas nécessaire sur la comparaison de dernière modification du fichier d'un fichier avec l'heure locale actuelle.
Plus le nom de fichier doit être spécifié toujours avec chemin d'accès complet dans wmic ligne de commande. Juste en spécifiant le nom de fichier pour un fichier dans le répertoire courant ou un nom de fichier avec un chemin relatif ne fonctionne pas. Et chaque barre oblique inverse doit être échappés avec une barre oblique inverse dans le nom du fichier avec le chemin d'accès.
Le principal inconvénient sur l'utilisation de wmic est la vitesse. Le code de lot besoins ci-dessus sur mon ordinateur environ 50 ms à terminer selon Le Moniteur De Processus log (moyenne de plusieurs essais). Le code du lot ci-dessous l'appel de wmic deux fois les besoins pour la même tâche sur 1500 ms à la fin (aussi une valeur moyenne). Par conséquent l'utilisation de wmic sur un grand nombre de fichiers est certainement pas une bonne idée si elle peut être évitée en raison local format de date/heure est connu.
wmic os get localdatetime
pour la date et l'heure; etwmic datafile where "name='c:\\path\\to\\file.ext'" get lastmodified
pour l'heure de dernière modification dans le même format. Les deux résultats sont en GMT et rapport du fuseau horaire / heure d'été compensé à la fin de la valeur.Merci @rojo pour ce complément d'information. J'ai ajouté encore un exemple de code à l'aide de wmic avec quelques informations sur les avantages et les inconvénients sur l'utilisation de wmic.
Je dois aussi dire que votre réponse m'a impressionné. Pour cette raison, j'ai dû une fois de plus ouvrir un bounty mais cette fois pour vous. Même s'il s'avère que la générosité est incrémenté par multiples de 2, c'est mérité.
Merci beaucoup @Paul. J'ai pensé que c'était vraiment le temps d'écrire tout ce que je sais à propos de fichier de gestion du temps par Windows et la comparaison des temps de fichiers après avoir lu de nombreux "plus que" des questions sur StackOverflow. J'espère que cette grande réponse aide de beaucoup d'autres. Entrée supplémentaire concernant les heures de fichier est le bienvenu à tout moment.
Malheureusement, il y a un autre problème avec l'
wmic
approche: vous ne pouvez pas spécifier les chemins d'accès aux fichiers contenant à la fois,
et)
-- voir aussi ma question: Comment faire pour échapper à la fois par des virgules et la parenthèse fermante dans la clause where de WMIC?OriginalL'auteur Mofi
Vous pouvez également créer un programme simple à l'aide de C# par exemple comme ça:
Ce programme pourrait alors être utilisé pour trouver tous les fichiers qui sont âgés de plus de 2 heures dans un fichier de commandes comme ça:
Une amélioration et d'auto-compilation de la version
Comme mentionné par @Paul, on pourrait même construire une hacky hybride lot /c# fichier qui vous permettra de compiler et d'exécuter lui-même:
Et peut être utilisée comme ceci:
Salut @Martin +1 btw. Peut le script peut compiler le code source à la volée. J'ai déjà vu un hybride script qui font cela. Je vais le regarder. merci
le problème avec les espaces est à venir à partir de la
for
de commande. Il suffit d'ajouter une"delims="
pour le fixer. J'ai également ajouté un auto-compilation de la version du script comme vous l'avez suggéré.J'ai ajouté un argument pour spécifier l'opérateur de comparaison
Oui, il suffit de passer quelque chose qui ne contiennent pas le mot
older
– e. g.younger
OriginalL'auteur Martin
La solution à cela dépendra beaucoup sur le temps prévu-gamme, car autant que je sache, vous n'obtenez pas le temps que l'un d'entier dans un fichier de commandes sans programmes externes. Cela signifie que vous devez analyser la valeur de temps dans votre script, et la quantité de l'analyse et le nombre de calculs nécessaires, dépendent de la gamme vous avez besoin pour ce travail.
Voici une solution simple. Il suppose que le fichier ne peut PAS être âgés de plus de 24 heures.
'"dir %filename%|find "%filename%""'
au lieu de'dir "%filename%" ^| find "%filename%"'
. Le résultat est que chaque fichier est âgé de plus de 4 heures. Et même avec cette correction, le code du lot ne peut être utilisé que pour les noms de fichiers ne contenant pas d'un chemin d'accès, car dir sorties juste le nom du fichier, mais trouver recherche par nom de fichier avec chemin d'accès.Le prochain problème à l'obtention de la date de dernière modification d'un fichier, qui doit être sans chemin d'accès, et donc dans le répertoire courant, à partir de la sortie de dir est filtré trouver et analysé par pour à l'aide du corrigé
'dir "%filename%" ^| find "%filename%"'
est causé par le fait que trouver les recherches sans paramètre/I
sensible à la casse. Donc, si le nom du fichier sans le chemin d'accès n'est spécifié sur la deuxième ligne exactement dans l'orthographe que de réellement stockées sur des supports de stockage, trouver toujours pas à trouver le ligne du fichier en sortie de dir. Et je vois d'autres problèmes avec ce code. Désolé!Je n'ai jamais testé ce script sur XP, et comme vous l'expliquez dans votre propre réponse à cette méthode de l'heure/date/modification de la date de l'analyse est très étroitement lié à l'os-version et les paramètres régionaux. Je ne préciser dans ma réponse que c'est une solution simple, mais il a fait un travail sur win7 de retour en 2011 quand j'ai posté 😉
drôle de chose: en fait j'ai pensé à ce post juste l'autre jour, et envisagé de mettre à jour ma réponse avec l'utilisation de wmic au lieu de%%, %%, dir et trouver. Mais en voyant votre réponse maintenant, je ne pense pas que je vais la peine 😉 je suis désolé que ma solution ne fonctionne pas pour vous.
OriginalL'auteur Superole
Pur lot est horrible à la date de mathématiques. Qu'advient-il si votre script est exécuté peu après minuit? Que faire si le temps de vérifier s'étend sur une Heure d'été changement?
Je propose invoquant Windows Script Host et emprunts d'une langue qui traite mieux de la date /heure de mathématiques. Voici un hybride lot /script JScript qui va calculer l'âge d'un fichier ou d'un répertoire assez facilement. Enregistrer avec une .extension bat et donner un coup de feu.
Pour plus d'informations sur lot /JScript hybride scripts, voir cette page GitHub. Le style utilisé ci-dessus est similaire à l'Hybride.chauve-souris sur la page. Cette réponse est basé sur un autre. Pour ce que ça vaut, PowerShell est aussi bon à la manutention date de mathématiques; mais WSH s'exécute beaucoup plus rapidement.
OriginalL'auteur rojo