Scripts batch

Résolu
Scripteur -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je vous expose mon soucis,

Je dois écrire un petit script batch qui détecte si un fichier en à modifié un autre (libre Office qui modifie un odt dans mon cas) le tout dans un script batch,

Je dois aussi montrer si libre Office supprime ce odt en question,

Sauriez vous comment faire cela s'il vous plaît ?

Merci pour votre aide

Cordialement

Scripteur

7 réponses

Résumé de la discussion

La problématique porte sur la détection par un script batch des modifications d'un fichier par une autre application, notamment LibreOffice qui peut modifier ou supprimer un fichier odt. Pour adresser ce besoin, plusieurs réponses évoquent l'utilisation de plusieurs scripts et la gestion des permissions, car les élévations et l'accès en écriture dépendent des droits sur les dossiers. Des éléments techniques proposent aussi l'emploi de la commande START pour lancer plusieurs instances, afin de paralléliser des commandes et gagner en réactivité dans des scénarios d'automatisation. En cas de contraintes, les échanges signalent que les approches dépendent fortement du contexte système et des politiques de sécurité, sans consigne générale unique.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Bonjour,

    Pour savoir de façon certaine si un fichier a été modifié, il suffit de comparer le hash du fichier à un instant T avec le hash du fichier à un autre instant T.
    0
    1. Scripteur
       
      Bonsoir,

      Mais n'y a t'il pas un moyen de mettre cela dans un batch ?

      Aussi, comment fait-on pour créer & configurer une variable qui est en fait une liste.txt,

      je m'explique:

      j'ai une liste de fichiers odt présente dans un Dossier et souhaite les supprimer de cette façon:

      set lavariableenuestion = une liste de fichiers
      lavariableenuestion in (liste.txt) do (del lavariableenuestion)

      Est-ce possible s'il vous plait ?

      Merci

      Scripteur
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Scripteur
         
        Est-ce que tu es obligé de passer par liste.txt ??? Ca me semble une étape inutile.

        En passant par liste.txt ça donnerait ça :
        for /f "delims=" %%A in (liste.txt) do (del %%A)

        ps : voilà la commande pour trouver le hash MD5 d'un fichier quelconque :
        CertUtil -hashfile fichier.exe MD5 | find /v ":"
        0
    2. Scripteur
       
      Merci pour votre réponse :

      En effet, trouver le MD5 d'un fichier me serait très utile,

      J'ai une dernière question :

      Est-il possible de supprimer un fichier selon son empreinte MD5 en mettant la liste des signature numérique (MD5) dans un fichier liste.txt s'il vous plaît ?

      Dois je mettre set MD5 = liste.txt ?

      Merci

      Scripteur
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Scripteur
         
        On verra ça ce soir, aujourd'hui boulot.
        0
  2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    J'ai du mal à comprendre la finalité de ton projet, de même que les étapes pour y parvenir.

    En attendant je t'ai fait un exemple dont tu peux t'inspirer :

    @echo off
    setlocal enableextensions disabledelayedexpansion
    chcp 65001 >nul

    set DossierODT=%USERPROFILE%\Documents\Dossier

    cd /d %DossierODT% || exit /b 1

    echo. > liste_md5.txt

    for %%A in (*.odt) do (call :hash "%%~A")

    notepad liste_md5.txt

    echo. & pause
    exit /b 0

    :hash
    for /f "delims=" %%E in ('CertUtil -hashfile "%~1" MD5 ^| findstr /v ":"') do (
    echo. & echo %~1;%%E
    echo. & echo %~1;%%E >> liste_md5.txt
    )
    goto :eof

    rem

    La partie soulignée est à remplacer par le dossier de ton choix.

    0
    1. Scripteur
       
      Bonsoir,

      Merci pour votre aide

      Je vais vous détailler mon soucis :

      J'ai des fichiers odt avec une signature en particulier, de l'autre, un fichier txt contenant des signature numérique qui ne sont pas (en théorie) affilié au odt en question,

      Je souhaiterais faire un petit script (une petite boucle for) qui irait comparer les odt avec les signatures référencés dans liste.txt, si une signature correspond avec un odt, alors, ce dernier supprimera l'odt invalide puisqu'elle correspond à la signature présente dans liste.txt

      Liste.txt est créer pour détecter la présence d'un fichier odt intrus avec des signature numérique en particulier prédéfinis dans liste.txt



      Merci d'avance pour votre réponse

      Scripteur
      0
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    En supposant que le fichier liste.txt existe déjà et respecte cette syntaxe :
    nom de fichier1;empreinte; 
    nom de fichier2;empreinte;
    nom de fichier3;empreinte;
    ...


    Voilà le script correspondant :
    @echo off
    setlocal enableextensions disabledelayedexpansion
    chcp 1252 >nul

    set DossierODT=%USERPROFILE%\Documents\dossier

    cd /d %DossierODT% || exit /b 1

    for %%A in (*.odt) do (call :comparaison "%%~A")

    echo. & pause
    exit /b 0

    :comparaison
    for /f "delims=" %%E in ('CertUtil -hashfile "%~1" MD5 ^| findstr /v ":"') do (

    for /f "usebackq tokens=1,2 delims=;" %%G in ("liste.txt") do (
    if "%%~E"=="%%~H" (
    echo. & echo %~1 [ %%E ] ==^>^> correspondance trouvée : suppression du fichier
    echo del /f "%~1" >nul
    )
    )
    )
    goto :eof

    rem

    0
    1. Scripteur
       
      Bonsoir,

      Merci, c'est exactement ce que je cherchais !

      Cependant, je me demandais s'il était possible de chercher cela dans tous le disque C:

      Dois je me placer dans C: et modifier
       del  /f 
      par
      del /f  /s
      ?

      Merci pour l'aide pertinente que vous m'avez apporté !!!

      Scripteur
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Scripteur
         
        Tout le disque C: ça va prendre un temps fou, mieux vaut cibler la recherche.

        En général tout est stocké dans le profil utilisateur (%USERPROFILE%), pas besoin de fouiller dans tout le disque.

        Actuellement mon script n'est pas prévu pour une recherche récursive, mais si tu veux je peux le modifier.
        0
    2. Scripteur
       
      "Actuellement mon script n'est pas prévu pour une recherche récursive, mais si tu veux je peux le modifier"

      Ce serais gentille de votre part, cela me serait très utile...

      Merci pour le temps que vous m'avez consacré (surtout à 23h)

      Scripteur
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Voilà une version récursive :

    @echo off
    setlocal enableextensions enabledelayedexpansion
    chcp 1252 >nul

    set DossierCible=%USERPROFILE%

    cd /d %DossierCible% || exit /b 1

    title Dossier Cible = %DossierCible%

    set liste=liste.txt

    if not exist "%liste%" (
    echo. & echo ##### Liste des empreintes introuvable #####
    timeout /t 5
    exit /b 1
    )

    for /f "delims=" %%A in ('2^>nul dir /b /s "*.pdf"') do (
    echo %%~A
    set nom=%%~nxA
    set nom=!nom:^(={!
    set nom=!nom:^)=}!
    if not "%%~nxA"=="!nom!" (ren "%%~A" "!nom!")
    set full=%%~dpA!nom!
    call:empreinte "!full!"

    )

    cls & echo. & echo ##### Fin de l'analyse #####
    timeout /t 5
    exit /b 0

    :empreinte
    for /f "delims=" %%E in ('CertUtil -hashfile "%~1" MD5 ^| findstr /v ":"') do (call:comparaison "%~1" "%%E")
    goto :eof

    rem

    :comparaison
    for /f "eol=µ tokens=1,2 delims=;" %%G in (%liste%) do (
    if /i "%~2"=="%%H" (
    cls & echo.
    echo %~nx1 [ %~2 ] ==^>^> correspondance trouvée : suppression du fichier
    echo del /f "%~1" >nul
    timeout /t 1
    echo.
    )
    )
    goto :eof

    rem

    Je rappelle que le fichier liste.txt doit être présent dans le dossier cible, et il doit respecter cette syntaxe :
    nom de fichier1;empreinte;
    nom de fichier2;empreinte;
    nom de fichier3;empreinte;
    ...

    Si tu veux d'autres modifications, fais-moi le savoir ;)

    0
    1. Scripteur
       
      Bonjour,

      Donc si je le met C: à la place de %USERPROFILE%,

      Je pourrais chercher dans absolument tous le disque ?
      Merci
      Scripteur
      0
    2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Scripteur
       
      Oui mais il faut mettre C:\

      Et ce sera assez lent comme je l'ai déjà dit.

      Si tu veux supprimer les fichiers, n'oublie pas d'enlever le ECHO que j'ai mis devant le DEL pour faire mes essais
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Pour accéder et supprimer des fichiers dans les dossiers système, il faut exécuter mon script avec le clic-droit puis "exécuter en tant qu'admin"

      ps : dans mon premier FOR il faut remplacer pdf par odt.
      0
    4. Scripteur
       
      Bonjour,

      cela ne semble pas fonctionner,

      Le script se lance et cherche dans le dossier racine et se ferme au bout de 4 seconde

      Est-ce normal ?

      Merci

      Scripteur
      0
    5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      C'est parce que tu n'as pas beaucoup de fichiers ODT

      Le script n'affiche que les dossiers/sous-dossiers qui possèdent des fichiers ODT
      0
  6. Scripteur
     
    Bonjour,

    Je reviens vers vous pour un tout autre soucis,

    Je suis en train d'utiliser ClamWin pour désinfecter un PC et me demandais, la commande clamscan -r -i / se contente t-elle de lire les fichiers et dire si ces derniers sont infecté ou les supprime t'il svp ?

    Je vous demande ça car j'ai essaye de faire un test eicar et ce dernier est passé comme OK (pour une raison que j'ignore) et n'ai donc pu vérifier cela

    Au passage, le script pour les ODTs fonctionne très bien, je vous en remercie

    Merci

    Scripteur
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Bonjour,

      Je ne peux pas répondre avec certitude, mais d'après ce que je vois le scan se contente d'analyser les fichiers, si tu veux mettre les fichiers infectés en quarantaine il faut utiliser le commutateur --move=DIRECTORY où DIRECTORY est un dossier de ton choix.
      0
    2. Scripteur
       
      J'ai donc continuer à chercher et j'ai trouvé cette commande en shell qui permet de supprimer un virus a partir d'une liste qui enregistre leurs path:

      http://forum.ubuntu-fr.org/viewtopic.php?id=273895

      for i in `cat /tmp/scan.txt`; do rm $i;done;


      Est-ce que l'équivalent en batch est ceci svp?:

      for /f %%i in (type  c:/scan.txt); do (del %%i) 


      Merci

      Scripteur
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Oui
      0
    4. Scripteur
       
      Du coup, en partant du principe que j'utilise une commande de ClamWin pour supprimer des fichiers,

      Je ne pourrais pas supprimer de virus s'il sont dans System32 par exemple (sans être admin)?

      Y'a t'il des virus qui arrivent à se loger dedans ou non SVP ?

      Merci

      Scripteur
      0
    5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Oui les virus arrivent à se loger dedans.

      ClamWin possède les droits administrateur, sinon il ne servirait à rien.
      0
  7. Scripteur
     
    Bon, au final, j'ai encore une question:

    Est-il possible de lancer plusieurs commande dans un même bat, je m'explique:

    Pouvoir lancer

    :fenêtre1
    ping 0.0.0.0

    :fenêtre2
    ping 1.1.1.1


    En même temps s'il vous plait, car sinon, cela m'oblige à créer plusieurs *.bat

    Merci

    Scripteur
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Non ce n'est pas possible.

      Je ne veux même pas savoir ce que tu es en train de faire.
      0
    2. Scripteur
       
      La commande ping n'était qu'un exemple...
      0
    3. Scripteur
       
      "Je ne veux même pas savoir ce que tu es en train de faire. "

      Je souhaite simplement automatiser une tache

      La commande ping n'était qu'un exemple...

      Je suis obligé de faire plusieurs scripts ?

      C'est la dernière question que je vous pose, promis, après je met le sujet en résolue

      Scripteur
      0
    4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Oui tu es obligé de faire plusieurs scripts.

      Tu peux poser autant de questions que tu veux, ça ne me dérange pas de répondre.

      J'ai juste du mal à cerner tes intentions.
      0
    5. Scripteur
       
      Croyez-moi, je ne fabrique pas de trojan^^

      Je cherche juste à exécuter plusieurs commande de clamscan.exe... pour pas que cela ne soit trop long en vus de les automatiser

      Je réalise plusieurs taches en batch que je devais faire depuis longtemps, et j'en ai profité pour vous bombardé de question tans que vous étiez dispo..
      0