1. #1
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut Problème pour récupérer la date de modification d'un fichier

    Bonjour,

    J'ai développé un script VBS qui va boucler un certain nombre de fois pour vérifier qu'un fichier bien spécifique est mis à jour régulièrement. (pour faire simple, ce script surveille le log d'un autre script pour vérifier qu'il est bien en cours d'exécution)

    A chaque itération, le script va comparer la date de modification du fichier scruté à celle de l'itération précédente. Si les 2 dates sont identique, ça envoie une alerte, sinon ça va attendre un certain nombre de minutes avant de passer à l'itération suivante.

    Pour récupérer la date de modification de mon fichier, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set oFile = oFSO.GetFile(p_filename)
    last_date = CDate(oFile.DateLastModified)
    set oFile = Nothing
    Or, il arrive très régulièrement que la date récupérée par cette méthode ne soit pas la bonne, un peu comme s'il y avait un cache des propriétés.
    A 5 minutes d'intervalle, il va me dire que c'est la même date de modification, alors que le fichier aura été pourtant bien été modifié plusieurs fois (la date affichée dans l'explorateur de fichier, elle, est bonne après un "F5").

    J'ai voulu feinter en utilisant "Shell.Application" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    set oFile = oFSO.GetFile(p_filename)
     
    tmp_foldername = oFSO.GetParentFolderName(oFile)
    tmp_filename = oFSO.GetFileName(oFile)
     
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.NameSpace(tmp_foldername)
    Set objFolderItem = objFolder.ParseName(tmp_filename)
     
    last_date = objFolder.GetDetailsOf(objFolderItem, 3)
     
    Set objFolder = Nothing
    Set objFolderItem = Nothing 
    Set objShell = Nothing
    Set oFile = Nothing
    mais j'ai exactement le même problème.


    Existe-t-il un moyen de faire en sorte de ne pas utiliser la valeur "dans le cache" mais de vraiment aller récupérer la date de modification du fichier ?


    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 018
    Points : 7 885
    Points
    7 885

    Par défaut

    Salut
    ce script surveille le log d'un autre script pour vérifier qu'il est bien en cours d'exécution
    Que donnerait la surveillance du dernier accès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    accest_date = objFolder.GetDetailsOf(objFolderItem, 5)
    Car le fichier à surveiller ne semble pas pour autant être modifié.

  3. #3
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Je me suis mal exprimé :
    J'ai un programme qui tourne pendant environ 4 heures et qui alimente au fur et à mesure un fichier "mon_programme.log".

    Comme ce programme peut planter sans qu'on s'en rende compte (sauf à garder un oeil dessus), je veux pouvoir lancer en parallèle un script qui va vérifier toutes les 10 minutes que le fichier de log a bien été mis à jour. Si entre 2 vérifications, la date du fichier de log est toujours la même, c'est que le programme a planté, donc on lance une alerte.

    Normalement, à chaque fois que le programme écrit dans le log, ça met à jour la date de modification du fichier de log. Par contre, ça ne met pas à jour la date de "dernier accès" au fichier.


    Tout ça pour dire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    accest_date = objFolder.GetDetailsOf(objFolderItem, 5)
    retournera une date encore plus ancienne que la date de modification (dans mon cas).
    J'ai beau écrire dans mon fichier de log, la date d'accès ne changera pas (elle ne change que quand je l'ouvre par l'explorateur de fichier).

    Par contre, quand j'écris dans le fichier de log, la date de modification change, mais pas à chaque fois.

  4. #4
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 018
    Points : 7 885
    Points
    7 885

    Par défaut

    Salut

    On voit bien que tu décharges (Set sous_objet = Nothing) les sous-objets de l'objet oFSO;
    En fais tu autant avec l'objet oFSO?
    Si non, cela vaudrait peut être le coup d'essayer, et de le recréer à chaque fois que tu cherches à avoir l'information de la date de modification du fichier.

  5. #5
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Je ne l'avais pas mis dans mon post, mais oui, je crée et set à Nothing mon objet oFSO à chaque itération de boucle.

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    Je n'arrive pas à constater ton problème de cache, avec ce bout de code, sur un Windows 7 Pro 64 bits.
    C'est systématique ? Est tu sur de ne pas avoir un problème de structure/logique avec ton code ?

    Je re-enregistre le fichier à chaque msgbox.

    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    For compteur = 0 To 10
    	set oFile = oFSO.GetFile("fichertest.txt")
    	last_date = CDate(oFile.DateLastModified)
    	msgbox last_date
    	set oFile = Nothing
    Next

  7. #7
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 018
    Points : 7 885
    Points
    7 885

    Par défaut

    Salut

    Pour ma part, une dernière tentative, ajouter une temporisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set oFile = oFSO.GetFile(p_filename)
    Wscript.Sleep 1000 ' temporisation d'une seconde
    last_date = CDate(oFile.DateLastModified)
    set oFile = Nothing
    Car moi non plus je ne parviens pas à reproduire ton problème, je suis aussi sous Windows 7 Édition Intégrale 64 bits.

  8. #8
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Soit un programme "write_log.vbs" qui écrit des logs de manière régulière (toutes les 20 secondes) dans le fichier "mon_log.log" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const ForAppending = 8
    Dim oFSO
    Set oFSO = CreateObject("Scripting.FileSystemObject")
     
     
    Set GLOBAL_LOG = oFSO.OpenTextFile(oFSO.GetAbsolutePathName("mon_log.log"), ForAppending, True)
     
     
    for i = 0 to 100
    	ts = Year(Now) & "-" & right("0" & Month(Now), 2) & "-" & right("0" & Day(Now), 2) & " " & right("0" & hour(Now), 2) & ":" & right("0" & Minute(Now), 2) & ":" & right("0" & Second(Now), 2)
     
    	GLOBAL_LOG.WriteLine "[" & ts & "] " & i
     
    	WScript.Sleep 20 * 1000	' Attente de 20 secondes
    next

    Voici mon script "is_alive.vbs" qui vérifie si le fichier de log "mon_log.log" a bien changé depuis 30 secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    const ForAppending = 8
     
    p_filename = "mon_log.log"
    pause_in_minutes = 0.5
    number_of_attemps = 100
     
    Set oFSO_log = CreateObject("Scripting.FileSystemObject")
    Set GLOBAL_LOG = oFSO_log.OpenTextFile(oFSO_log.GetAbsolutePathName("is_alive.log"), ForAppending, True)
     
     
     
    last_date = -1
     
    Dim cpt
    for cpt = 0 to number_of_attemps
    	previous_date = last_date
     
    	Set oFSO = CreateObject("Scripting.FileSystemObject")
     
    	' On teste si le fichier existe toujours.
    	file_exists = oFSO.FileExists(p_filename)
    	if not file_exists Then
    		msgbox "Le fichier n'existe plus"
    		Exit For  
    	end if 
     
    	' On récupère la date de modification du fichier.
    	set oFile = oFSO.GetFile(p_filename)
    	last_date = CDate(oFile.DateLastModified)	
     
     
    	'tmp_foldername = oFSO.GetParentFolderName(oFile)
    	'tmp_filename = oFSO.GetFileName(oFile)
     
    	'Set objShell = CreateObject("Shell.Application")
    	'Set objFolder = objShell.NameSpace(tmp_foldername)
    	'Set objFolderItem = objFolder.ParseName(tmp_filename)
     
    	'last_date = objFolder.GetDetailsOf(objFolderItem, 3)
     
    	'Set objFolder = Nothing
    	'Set objFolderItem = Nothing 
    	'Set objShell = Nothing
    	set oFile = Nothing
    	set oFSO = Nothing
     
    	ts = Year(Now) & "-" & right("0" & Month(Now), 2) & "-" & right("0" & Day(Now), 2) & " " & right("0" & hour(Now), 2) & ":" & right("0" & Minute(Now), 2) & ":" & right("0" & Second(Now), 2)
     
    	GLOBAL_LOG.WriteLine "[" & ts & "] " & cpt & " / " & number_of_attemps & " : fichier modifié le " & last_date & " (comparé à " & previous_date & ")"
     
    	If previous_date = last_date Then
     
    		msgbox "Le fichier n'a pas changé depuis " & previous_date
    		GLOBAL_LOG.WriteLine "[" & ts & "] " & cpt & " / " & number_of_attemps & " : Le fichier n'a pas changé depuis " & previous_date
    		Exit For 
    	End If
     
    	WScript.Sleep pause_in_minutes * 60 * 1000
    Next
     
    Set oFSO_log = Nothing 
    Set GLOBAL_LOG = Nothing

    En ligne de commande :
    puis dans une autre fenêtre
    Voici le contenu de "mon_log.log" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [2017-06-01 09:31:51] 0
    [2017-06-01 09:32:11] 1
    [2017-06-01 09:32:31] 2
    [2017-06-01 09:32:51] 3
    [2017-06-01 09:33:11] 4
    [2017-06-01 09:33:31] 5
    [2017-06-01 09:33:51] 6
    [2017-06-01 09:34:12] 7
    [2017-06-01 09:34:31] 8
    On constate que le fichier a bien été mis à jour toutes les 20 secondes.


    Voici le log de mon script "is_alive.log" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [2017-06-01 09:33:03] 0 / 100 : fichier modifié le 01/06/2017 09:32:53 (comparé à -1)
    [2017-06-01 09:33:33] 1 / 100 : fichier modifié le 01/06/2017 09:33:13 (comparé à 01/06/2017 09:32:53)
    [2017-06-01 09:34:03] 2 / 100 : fichier modifié le 01/06/2017 09:33:13 (comparé à 01/06/2017 09:33:13)
    [2017-06-01 09:34:03] 2 / 100 : Le fichier n'a pas changé depuis 01/06/2017 09:33:13
    A 09:34:03, il pense que le fichier "mon_log.log" n'a pas été mis à jour depuis 09:33:13, alors que si on regarde son contenu, on voit que si (2 fois même).

    En vrai, les délais sont plus longs (vérification toutes les 10 minutes), mais le problème est le même.

    Je suis sous Windows Server 2008 SR2.


    EDIT : Je viens de tester avec un Windows 10, j'ai le même problème.

  9. #9
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 018
    Points : 7 885
    Points
    7 885

    Par défaut

    Re

    En effet, mes essais avaient porté sur une dizaine de versification toute les 5 secondes, là c'était Ok, en passant à 30 toutes les minutes, cela devient aléatoire.
    Je pencherai, comme toi dés ton premier post, que la tempo de surveillance et/ou le nombre d'itérations fait que le système Windows décide de remettre à plus tard l'actualisation réelle des infos du fichier, problème de cache que tu as détecté dés le début.
    J'avoue que je n'ai pas réussi et ne sais pas vider le cache pour se type de situation en VBScript.
    Bon courage pour la suite.

  10. #10
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Ce qui m'embête, c'est que dans mon cas réel, je ne vérifie pas le fichier de log toutes les 30 secondes, mais toutes les 10 minutes, et même là, la date n'est pas mise à jour malgré des centaines de lignes écrites dans le log !

    Tiens, d'ailleurs je me demande si je ne pourrais pas contourner mon problème simplement en vérifiant aussi la taille ou le checksum du fichier scruté...

  11. #11
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    J'ai effectivement constaté le problème dont tu parle mais il ne semble pas venir de "DateLastModified".

    Pour un autre besoin j'avais développé un C# un outil de surveillance d'activité disque (réseau et local), j'ai eu la bonne idée de l'utilisé.

    Je me suis contenté de lancer le script "write_log.vbs" et surveiller les dates de modification avec mon programme, voici ce qu'il m'affiche :
    01/06/2017 18:40:36: Fichier Created : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:41:07: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:41:31: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:41:57: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:44:47: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:47:29: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:47:41: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:48:04: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:48:47: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:49:05: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    Nous remarquons que les changements ne sont pas toutes les 20 secondes. Certaines modifications interviennent au moment ou je rafraichit l’affichage ou que je sélectionne le fichier.
    Je pense que cette étrangeté est donc lier à "WriteLine". Directement à lui ou à la façon dont il demande à Windows d'écrire dans le fichier.


    J'ai essayer ce code modifié pour forcer l'écriture dans le fichier en fermant le handle associé :
    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const ForAppending = 8
    Dim oFSO
    Set oFSO = CreateObject("Scripting.FileSystemObject")
     
    for i = 0 to 100
    	ts = Year(Now) & "-" & right("0" & Month(Now), 2) & "-" & right("0" & Day(Now), 2) & " " & right("0" & hour(Now), 2) & ":" & right("0" & Minute(Now), 2) & ":" & right("0" & Second(Now), 2)
     
    	Set GLOBAL_LOG = oFSO.OpenTextFile(oFSO.GetAbsolutePathName("mon_log.log"), ForAppending, True)
    	GLOBAL_LOG.WriteLine "[" & ts & "] " & i
    	GLOBAL_LOG.Close
     
    	WScript.Sleep 20 * 1000	' Attente de 20 secondes
    next

    Et voici le log d'activité :
    01/06/2017 18:35:56: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:36:16: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:36:36: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:36:56: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:37:16: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:37:36: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:37:56: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:38:16: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:38:36: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:38:56: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:39:16: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:39:36: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    01/06/2017 18:39:56: Fichier Changed : "C:\Users\Rico\Desktop\mon_log.log"
    Ici il écrit bien dans le fichier toutes les 20 secondes.

  12. #12
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    Si tu ne souhaite pas modifier le script d'origine "write_log.vbs" je pense qu'un simple OpenTextFile en ForReading (ReadOnly), avant le DateLastModified, devrait forcer son écriture (la date sera donc bonne) et ne pas poser de problème d'accès concurrentiel.

  13. #13
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Malheureusement, le fait d'ouvrir le fichier en lecture seule ne fonctionne pas

    J'ai même essayé de le lire un peu, ça ne change rien.

  14. #14
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    Et pour la réponse du 01/06/2017, 18h58 ?
    En forcant l'écriture dans le fichier en fermant le handle associé

  15. #15
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    En faisant en sorte que celui qui crée le log ouvre et ferme le fichier à chaque écriture de ligne, ça semble mieux fonctionner.

    Par contre je n'aurai pas la possibilité de modifier de nombreux programmes que je souhaite surveiller (car je ne suis pas l'éditeur et que je n'ai qu'un ".exe" à ma disposition)

  16. #16
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    Ok je testerai ma deuxième solution

  17. #17
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par ericlm128 Voir le message
    Ok je testerai ma deuxième solution
    C'est en testant la 2em solution que j'ai écrit que ça ne fonctionnait pas.

    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	Set tmp = oFSO.OpenTextFile(oFSO.GetAbsolutePathName(p_filename), ForReading)
    	tmp.Close 
    	Set tmp = Nothing
    juste avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	set oFile = oFSO.GetFile(p_filename)
    	last_date = CDate(oFile.DateLastModified)
    et ça n'a rien changé.

  18. #18
    Membre chevronné

    Homme Profil pro
    Responsable déploiement (SCCM, AirWatch, AMP)
    Inscrit en
    juillet 2014
    Messages
    982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, AirWatch, AMP)
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2014
    Messages : 982
    Points : 1 809
    Points
    1 809

    Par défaut

    Effectivement, cela semble moins fréquent mais le phénomène est toujours présent.

    Étrange le fonctionnement interne de cet objet "TextStream".
    La date de modification est mise à jour mais semble être faite en différée, surement une opération Windows en "Pending".

    Si tu n'a pas la main sur le script d'origine, pour forcer l'écriture (.Close) tu ne peux pas te fier à cette information.

    Pour ma part si j’étais toi j’opterai pour une autre approche :
    - Je n'ai pas de soucis en comparant le contenu (je suis conscient que cela charge plus qu'une simple vérification de date)
    - Ne peux tu pas vérifier directement si le processus (ligne de commande de démarrage ...) est existant sur le poste ?

    Idée de solution pour comparer le contenu :
    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    const ForReading = 1
     
    Dim oFSO
    Set oFSO = CreateObject("Scripting.FileSystemObject")
     
    last_data = ""
     
    for i = 0 to 10000
    	previous_data = last_data
     
    	Set GLOBAL_LOG = oFSO.OpenTextFile(oFSO.GetAbsolutePathName("mon_log.log"), ForReading)
    	last_data = GLOBAL_LOG.ReadAll()
    	GLOBAL_LOG.Close
     
    	If previous_data = last_data Then
    		msgbox "Le fichier n'a pas changé"
    	End If
     
    	WScript.Sleep 5000
    next

  19. #19
    Modérateur

    Inscrit en
    octobre 2006
    Messages
    1 304
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 1 304
    Points : 2 082
    Points
    2 082
    Billets dans le blog
    4

    Par défaut

    - Ne peux tu pas vérifier directement si le processus (ligne de commande de démarrage ...) est existant sur le poste ?
    Non justement
    Mon problème est que le programme que je surveille a tendance à rester "bloqué", mais il n'est lui même pas au courant qu'il est planté. Je sais (par expérience) que s'il n'a rien fait pendant 10 minutes, c'est que je peux l'arrêter et le relancer.



    - Je n'ai pas de soucis en comparant le contenu (je suis conscient que cela charge plus qu'une simple vérification de date)
    A la base, je voulais rajouter une comparaison du MD5 (ou autre hash) du fichier. Finalement, j'ai opté au plus simple (de mes compétences) en vérifiant la dernière ligne du log que je récupère avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	Set tmp = oFSO.OpenTextFile(oFSO.GetAbsolutePathName(p_filename), ForReading)
     
    	Do Until tmp.AtEndOfStream
    		strLine = tmp.ReadLine
    	Loop
     
    	tmp.close 
    	Set tmp = Nothing
    (le fichier complet pouvant être assez gros, j'avais peur que la comparaison des 2 chaines soient assez lourde)

  20. #20
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    4 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 4 018
    Points : 7 885
    Points
    7 885

    Par défaut

    Salut

    Peu être plus rapide pour obtenir la dernière ligne du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     	Set tmp = oFSO.OpenTextFile(oFSO.GetAbsolutePathName(p_filename), ForReading)
    	'Do Until tmp.AtEndOfStream
    	'	strLine = tmp.ReadLine
    	'Loop
    	strLine = split(tmp.ReadAll,vbnewline)(tmp.Line-1)
    	tmp.close
    	Set tmp = Nothing

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/05/2017, 10h55
  2. [Batch] Récupérer la date de modification d'un fichier
    Par KuBi4K dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 18/06/2010, 11h16
  3. Réponses: 2
    Dernier message: 22/10/2009, 21h39
  4. Récupérer la date de modif d'un fichier
    Par Sensei.Dje dans le forum C
    Réponses: 1
    Dernier message: 04/01/2008, 10h57
  5. Réponses: 2
    Dernier message: 10/10/2006, 20h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo