Question

J'essaie de comparer une liste de fichiers avec un fichier de contrôle sur leur horodatage modifié en utilisant

dir /b /tw /od controlfile olderfile | more +1

Cela devrait retourner le controlfile Comme la date modifiée sur olderfile est plus tôt que controlfile. Cependant, il semble comparer la date de création (olderfileLa date de création est après controlfile's) et il reviendra toujours olderfile. La /tw Le commutateur doit dire dir Pour utiliser la dernière date écrite (de dir /?) donc je ne sais pas ce que je fais de mal si je veux que / TW fonctionne comme documenté?

:METTRE À JOUR:

Jusqu'à présent, j'avais olderfile dans un sous-dossier par rapport à controlfile. Quand j'ai copié olderfile au même répertoire que controlfile La comparaison a fonctionné comme prévu - c'est-à-dire que la commande ci-dessus est retournée controlfile. Ainsi, être dans un sous-dossier brise évidemment la comparaison (même lorsque la date modifiée du sous-dossier est comme celle de olderfileest lui-même plus tôt que celui de controlfile).

Donc, ma question est maintenant de savoir comment puis-je solution, étant donné que la structure du répertoire est requise?

Était-ce utile?

La solution

D'abord une explication de la raison pour laquelle votre code échoue.

En regardant DIR sans l'option / b, il affiche toujours le chemin du fichier comme une ligne d'en-tête, jamais avec le nom de fichier. Lorsque vous utilisez l'option de tri avec 2 spécifications de fichiers dans le même répertoire, la commande est capable de trier les fichiers et de les afficher sous le même en-tête de répertoire. Même si le nom du fichier est répété, vous savez exactement quel fichier est mentionné par l'en-tête.

Mais si les 2 spécifications de fichiers sont dans des chemins différents, il est possible que le nom de fichier soit le même et seuls les chemins diffèrent. Dans ce cas, le type ne fait pas de bien à moins que chaque spécification de fichier soit triée sous son propre en-tête; Sinon, vous ne pouviez pas dire quel fichier était lequel. Cela n'a pas beaucoup de sens de trier un seul fichier, mais n'oubliez pas que la spécification de fichier peut inclure des caractères génériques, donc cela a du sens. Ainsi, chaque fois que l'option de tri est combinée avec plusieurs spécifications de fichiers à l'aide de différents chemins, DIR effectuera un tri séparé pour chaque chemin, chacun avec son propre en-tête.

L'ajout de l'option / b supprime les en-têtes de chemin, mais il ne change pas le comportement de tri! Absolument un design idiot et inutile, mais c'est ce que vous obtenez.

Arriver à une solution est beaucoup plus problématique, surtout si vous souhaitez utiliser un lot pur avec uniquement des commandes Windows natives. Travailler avec des dates peut être exaspérant avec un lot.

La solution de lots la plus opportune que je puisse trouver est de copier temporairement le 2ème fichier dans le répertoire parent, d'exécuter votre comparaison dans le répertoire parent, puis de delà la copie temporaire. Mais cela pourrait être un problème si le fichier est grand. Il suppose également que le nom de fichier n'existe pas déjà dans le répertoire parent. S'il existe (ou peut), vous pouvez copier le fichier en un nom différent, connu pour être unique. Bien sûr, vous devrez alors traduire le résultat.

D'après ce que je peux dire, toute autre solution de lots nécessitera l'analyse de la date et de l'heure. Cela ouvre une boîte entière de vers. (C'est faisable)

Si la suggestion de copie n'est pas acceptable (je ne vous blâmerais pas si vous décidez de ne pas l'utiliser), je recommande en utilisant autre chose que le lot, peut-être VBScript, JavaScript ou PowerShell. Ou peut-être une approche hybride comme un lot avec un certain VBScript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top