IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Liste des fichiers ouverts par un processus en ligne de commande


Sujet :

Scripts/Batch

  1. #1
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut Liste des fichiers ouverts par un processus en ligne de commande
    Bonjour,

    Je voudrai savoir si il y avait un moyen de lister les fichiers ouverts par un processus.
    Je n'ai pas trouvé de ligne de commande comme lsof sous Unix.
    openfiles ne semble prendre en compte que les fichiers du réseau, alors que je voudrai rester en local.
    Je cherche à faire cela sous Windows XP.
    Si vous avez une idée ou une piste pour faire un script, je prends !

    Merci d'avance.

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    tu peux utiliser cet utilitaire, Handle.
    Un script d'usage sous PowerShell

  3. #3
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Merci pour l'info et le script

    J'ai téléchargé handle et j'ai testé le script en faisant le .bat suivant au niveau du répertoire de handle.exe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    handle.exe | foreach{
        if ($_ -match '^(?<program>\S*)\s*pid: (?<pid>\d*)\s*(?<user>.*)$') {
            $matches | %{
            $id = $_.pid
            $program = $_.program
            $user = $_.user
            }
        }
        if ($_ -match '^\s*(?<handle>[\da-z]*): File  \((?<attr>...)\)\s*(?<file>(\\\\)|([a-z]:).*)') {
            #$_
            $matches | select @{n="Pid";e={$id}}, @{n="Program";e={$program}}, @{n="User";e={$user}}, @{n="Handle";e={$_.handle}}, @{n="attr";e={$_.attr}}, @{n="Path";e={$_.file}}
        }
    
    } | out-Gridview
    En le lançant dans une console MS-Dos, le message suivant m'est renvoyé :

    'foreach{' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.
    Est-ce que je dois installer autre chose ? J'avoue ne pas connaître grand chose à part les lignes de commandes basiques.
    Il n'y a pas moyen de faire la même chose avec du batch classique ?

  4. #4
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle -p nom_processus
    devrait être suffisant, après tu peux encore affiner en filtrant le résultat.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mlny84
    Est-ce que je dois installer autre chose ?
    L'exemple nécessite le Shell Microsoft PowerShell.
    Citation Envoyé par minnesota
    après tu peux encore affiner en filtrant le résultat.
    J'ai cité l'exemple, car il contenait une analyse du résultat à l'aide de regex, c'est ce qui manque au batch, comme d'autre choses d'ailleurs...
    C'est juste une démo du couplage de programme console et de PowerShell.

  6. #6
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    J'ai cité l'exemple, car il contenait une analyse du résultat à l'aide de regex, c'est ce qui manque au batch, comme d'autre choses d'ailleurs...
    C'est juste une démo du couplage de programme console et de PowerShell.
    J'avais très bien compris que c'est une illustration très cher Laurent bien que pour les regex y'a findstr, non ? Mais bon.

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par minnesota Voir le message
    bien que pour les regex y'a findstr, non ?
    Effectivement tu as raison, mais de mon coté les batchs j'ai un peu décroché...
    Pour info.

  8. #8
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,
    Citation Envoyé par minnesota Voir le message
    J'avais très bien compris que c'est une illustration très cher Laurent bien que pour les regex y'a findstr, non ? Mais bon.
    Citation Envoyé par Laurent Dardenne Voir le message
    Effectivement tu as raison
    Pour info.
    il est clair que FindStr.exe ne supporte que les bases des RegExp's et parfois on est confronté devant des expressions rationnelles illogique que FindStr.exe traitent comme si c'étaient des motifs correspondants.


    selon l'auteur du blog l'opérateur pipe "|" n'est pas supporté par FindStr.exe, donc on ne peux traiter qu'un motif à la fois. On peux contourné ce problème de "pipe" en utilisant l'une de ces deux expressions natives:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr "abc def" fichier
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr -rc:abc -rc:def fichier
    aussi pour le quantificateur de répétition "{n}". On peux forcer FindStr.exe à matcher uniquement des chaînes ayant une longueur donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findstr -rb "...$" fichier

    mais ça reste, comme vous voyez pas élégant.

    Citation Envoyé par Laurent Dardenne Voir le message
    mais de mon coté les batchs j'ai un peu décroché...
    ça c'est une triste nouvelle, prendre l'air oui mais décroché..

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE
    mais ça reste, comme vous voyez pas élégant.
    Que cela soit possible c'est déjà bien.
    Citation Envoyé par I'm_HERE
    ça c'est une triste nouvelle, prendre l'air oui mais décroché.
    Si je pouvais réaliser quelque chose comme ceci en batch, j'y serais encore accroché.
    De tout de façon les batch on ne peut pas s'en passer.

    ps
    Désolé mlny84, on squatte un brin ton post

  10. #10
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Citation Envoyé par minnesota Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle -p nom_processus
    devrait être suffisant, après tu peux encore affiner en filtrant le résultat.
    J'ai testé en ouvrant un fichier texte avec Notepad ++ et en utilisant la commande, bizarrement le fichier n'est pas dans la liste des fichiers retournées, vous avez une idée du pourquoi ?
    En effet dans la section File je n'ai quasiment que des C:\Windows\...

    Citation Envoyé par Laurent Dardenne Voir le message
    Désolé mlny84, on squatte un brin ton post
    Pas de soucis

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mlny84
    vous avez une idée du pourquoi ?
    Il se peut que ton programme libére le handle après avoir chargé le contenu du fichier en ram.
    Faut le vérifier avec process monitor, dispo sur le même site.

  12. #12
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Il se peut que ton programme libére le handle après avoir chargé le contenu du fichier en ram.
    Faut le vérifier avec process monitor, dispo sur le même site.
    Très bonne supposition !
    J'ai essayé avec le notepad classique, et là ça m'affiche le chemin vers le répertoire du fichier que j'ai ouvert, et non pas jusqu'au nom du fichier (mais bon c'est déjà mieux).

    Je vais continuer mes tests en installant process monitor et je vous tiens au courant.

    EDIT : et bien j'ai la même chose concernant Notepad avec Process monitor, il ne met que le chemin vers le répertoire de mon fichier.

    Je pense donc qu'une simple installation de handle suffit à répondre à ma question ; après tout dépend de la gestion des fichiers par le processus.

    Merci à tous

  13. #13
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Si je pouvais réaliser quelque chose comme ceci en batch, j'y serais encore accroché.
    je sais c'est pas du batch brute mais ça doit, répondre à la moitier de ce que peux faire replace-string à savoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    La fonction Replace-String remplace dans une chaîne de caractères toutes les occurrences d'une chaîne de caractères par une autre chaîne de caractères.
    Le contenu de la chaîne recherchée peut-être soit une chaîne de caractère simple soit une expression régulière.
    pas bien tester et pouvant être améliorer.bat
    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
    @echo off
    
    If Not exist "%~1" goto :help 
    
    :: Initialistaion des variables
    set "fichier=%~1"
    set "pattern=%~2"
    set "flag=%~3"
    set "tmpvbs=%Temp%.\$$$.$$"
    set "tmpfile=%Temp%.\$$$.$$$"
    
    1>"%tmpvbs%"  Call :rex pattern flag 
    type "%fichier%"|>"%tmpfile%" cscript -nologo -e:vbs "%tmpvbs%" 
    if exist "%tmpfile%" (move "%tmpfile%" "%fichier%")
    del "%tmpvbs%"
    exit /b
    
    :rex
    Setlocal EnableDelayedExpansion
    echo set rex=new regexp
    echo rex.global=true
    echo rex.pattern="!%1!"
    echo wsh.stdout.write rex.replace(wscript.stdin.readall,"!%2!")
    echo set rex=nothing
    Endlocal & Goto :EOF
    
    :Help
      cls
      echo.
      echo DESCRIPTION:
      echo     Remplace une chaine de caracatères par une autre
      echo.
      echo SYNTAXE: 
      echo     %~nx0 fichier motif chaine_de_remplacement
      echo. 
      echo EXEMPLE: 
      echo     %~nx0 fichier.txt "[$.:0-9]" ""
      echo.
    Goto:EOF

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE
    je sais c'est pas du batch brute
    Bah PowerShell serait un peu court sans les classes du framework dotnet. J'encapsule, en gros ces méthodes.
    L'approche est identique en utilisant l'objet Regexp du vbscript.
    Citation Envoyé par I'm_HERE
    mais ça doit répondre à la moitié de ce que peux faire replace-string
    Oui tout à fait, l'autre moitié sera plus difficile à mettre en oeuvre car liée aux objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     #On valide la modification dynamique de $Inputobject via un délégué
    $h=new-object System.Collections.Specialized.OrderedDictionary
     #Recherche le contenu 'File' dans la propriété 'Type'
     #En cas de succès ajoute dynamiquement une propriété nommée 'File' 
    $h."File"={ Add-Member -input ($InputObject -as [psObject]) -member NoteProperty -Name $args[0] -Value "Ajout dynamique" ;return $args[0]}
     #Modifie la propriété créée    
    $h."(Ajout dynamique)"='$1 MODIFIE'
    $O=New-Object PSObject -Property @{Name="Test_ToDelete.tmp";Path="C:\Temp";Value="Fichier de tests.";Type="File"}
    $O=$O|Replace-String $h -Property @("T*","File")
    Assert (($O|gm -member NoteProperty -Name File) -ne $null) "[Succ] `$InputObject modifié via un délégué."
    En même temps je ne pense pas utiliser ce type de traitement tout les jours :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/02/2011, 11h11
  2. liste des fichiers ouverts
    Par zizo81 dans le forum VBScript
    Réponses: 0
    Dernier message: 30/07/2010, 10h35
  3. copier un dossier contenant des fichiers ouverts par d'autres application
    Par guefrachi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/07/2010, 19h55
  4. Plugin Liste des fichiers ouverts
    Par eclnico dans le forum Eclipse
    Réponses: 0
    Dernier message: 18/05/2009, 15h34
  5. Réponses: 8
    Dernier message: 10/05/2008, 19h10

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