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 :

Fermer un dossier déja ouvert [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut Fermer un dossier déja ouvert
    Bonjour,

    je sais ouvrir un dossier avec powershell :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    start  C:\Users\myName\Desktop\MyFolder
    ou
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $var1 = "C:\Users\myName\Desktop\MyFolder"
    ii $var1

    Je voudrais savoir s'il est possible de fermer ce dossier. Si c'est le cas, est-ce que ça reste possible s'il n'a pas été ouvert avec PowerShell ?
    Merci d'avance pour votre réponse.
    Arsène

  2. #2
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Je ne sais pas si ce code en vbscript peut vous aider ou non ? How to close a specific folder with VBScript?
    Code vb : 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
    Option Explicit
    If AppPrevInstance() Then 
        MsgBox "There is an existing proceeding !" & VbCrLF &_
        CommandLineLike(WScript.ScriptName),VbExclamation,"There is an existing proceeding !"    
        WScript.Quit   
    Else
    Dim MyFolder,ws
    Set ws = CreateObject("wscript.shell")
    Myfolder = ws.ExpandEnvironmentStrings("%temp%")
    Do
        Call CloseThis(MyFolder)
        wscript.sleep 1000
    Loop
    End If
    '*********************************************************************************************
    Sub CloseThis(Folder)
    Dim sh,w
    Set sh = CreateObject("shell.application")
    For Each w In sh.Windows
        If w.document.folder.self.Path = Folder Then w.Quit
    Next
    End Sub
    '*********************************************************************************************
    Function AppPrevInstance()   
        With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
            With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
                " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
                AppPrevInstance = (.Count > 1)   
            End With   
        End With   
    End Function    
    '*********************************************************************************************
    Function CommandLineLike(ProcessPath)   
        ProcessPath = Replace(ProcessPath, "\", "\\")   
        CommandLineLike = "'%" & ProcessPath & "%'"   
    End Function
    '*********************************************************************************************

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par hackoofr;
    Je ne sais pas si ce code en vbscript peut vous aider ou non ?
    Merci pour ce code. Malheureusement c'est assez éloigné de la solution que je recherche. Je pense qu'il doit en exister une avec PowerShell qui soit plus simple et plus courte. J'ai trouvé ce code qui conforte mon idée :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ShellExp = New-Object -ComObject Shell.Application
    $ShellExp.open("C:\Users\myName\Desktop\MyFolder")
     
    #Get-Process | Where-Object {$ShellExp} | stop-process

    Ça ferme tout ce qui est ouvert, y compris le dock et les navigateurs, et ça ouvre le dossier "accès rapide".

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Je pense qu'il faut se servir d'un fichier batch et l'exécuter avec powershell.

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    Start-Process "cmd.exe"  "/c C:\Users\xxx\Desktop\closeFolder.bat"

    Le fichier closeFolder.bat que voici ne marche pas malheureusement :

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DirectoryName = "C:\Users\xxx\Desktop\myFolder"
     
    TASKKILL /F /FI "WINDOWTITLE eq %DirectoryName%" /IM explorer.exe

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Voilà le code batch qui ouvre un dossier et qui le referme 3 secondes plus tard :

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    explorer C:\Users\xxx\Desktop\monDossier
     
    timeout 3
     
    TASKKILL /F /FI "WINDOWTITLE eq monDossier" /IM explorer.exe

  6. #6
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    Fermer une fenêtre, c'est quand même "moins dangereux" que de killer
    l'explorateur, surtout s'il est paramétré pour n'autoriser qu'une seule
    instance, ou qu'une autre instance est déjà ouverte sur le même
    dossier.

    Le code vbscript proposé est intéressant, la "charge utile" est
    entre les lignes 16 et 22, ce n’est pas si long qu'il y parait en fait.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par CTJayce Voir le message
    Fermer une fenêtre, c'est quand même "moins dangereux" que de killer
    l'explorateur...
    Le code vbscript proposé est intéressant, la "charge utile" est
    entre les lignes 16 et 22, ce n’est pas si long qu'il y parait en fait.
    Je vais suivre ce précieux conseil et utiliser le code vbscript. C'est préférable en effet. Merci bien.

  8. #8
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    Dans les grandes lignes, ça donnerait quelque chose comme ça :

    close_window.vbs
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    exit_code=1
    For Each window in CreateObject("shell.application").Windows
    If (StrComp(window.document.folder.self.path, WScript.Arguments.Item(0), vbTextCompare)=0) Then 
      window.Quit
      exit_code=0
    End If
    Next
    Wscript.Quit exit_code

    usage : cscript //nologo close_window.vbs "chemin_du_dossier"

    Un errorlevel égal à 0 indique seulement qu'au moins une instance de la
    fenêtre a été trouvée et qu'un message de fermeture lui a été envoyé.
    Dans l'état actuel du script, il ne présage pas de sa fermeture effective.

    PS: Des améliorations possibles pourraient être d'ajouter des options pour
    fermer les fenêtres enfants, ou fermer toutes les fenêtres sauf celle
    spécifiée, etc.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par CTJayce Voir le message
    Dans les grandes lignes, ça donnerait quelque chose comme ça
    J'ai trouvé un code minimaliste qui fonctionne très bien :

    Fichier closeDossier.ps1 :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    cScript C:\Users\xxx\Desktop\closeFolder.vbs

    Fichier closeFolder.vbs :

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    myfolder = "C:\Users\xxx\Desktop\monDossier"
    Set sh = CreateObject("shell.application")
    For Each w In sh.Windows
        If w.document.folder.self.Path = myfolder Then w.Quit
    Next

  10. #10
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Voici une petite adaptation inspiré du code posté par CTJayce
    Code BAT : 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
    @echo off
    Mode 80,5 & color 0B
    Set VBSFILE=%Temp%\close_window.vbs
    Set Folder2Close=%Temp%
    Explorer %Folder2Close%
    echo(
    echo      Le dossier temporaire "%Folder2Close%" est ouvert !
    echo           Appuyez sur une touche pour le fermer !
    pause>nul
    Call :CloseThisFolder %Folder2Close%
    Exit
    ::-------------------------------------------------------------------------------------------------------------
    :CloseThisFolder
    ( 
        echo For Each window in CreateObject("shell.application"^).Windows
        echo If (StrComp(window.document.folder.self.path, WScript.Arguments.Item(0^),vbTextCompare^)=0^) Then 
        echo  window.Quit
        echo End If
        echo Next
    )>%VBSFILE%
    cscript //nologo %VBSFILE% "%~1"
    Exit /b
    ::-------------------------------------------------------------------------------------------------------------
    Ou bien :
    Code BAT : 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
    @echo off
    Mode 80,5 & color 0B
    Set VBSFILE=%Temp%\close_window.vbs
    Set Folder2Close=%Temp%
    Explorer %Folder2Close%
    echo(
    echo      Le dossier temporaire "%Folder2Close%" est ouvert !
    echo           Appuyez sur une touche pour le fermer !
    pause>nul
    Call :CloseThisFolder %Folder2Close%
    Exit
    ::-------------------------------------------------------------------------------------------------------------
    :CloseThisFolder
    ( 
        echo For Each window in CreateObject("shell.application"^).Windows
        echo     If window.document.folder.self.Path = WScript.Arguments.Item(0^) Then window.Quit
        echo Next
    )>%VBSFILE%
    cscript //nologo %VBSFILE% "%~1"
    Exit /b
    ::-------------------------------------------------------------------------------------------------------------

  11. #11
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    Oui, mais attention, une comparaison de chaine de caractères
    en vbs se fait par défaut en mode binaire, et c'est sensible
    à la casse.

    exemple:
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    str1="c:\abc\users"
    str2="c:\abc\Users"
     
    if str1=str2 then 
    wscript.echo "str1 et str2 identiques"
    else
    wscript.echo "str1 et str2 différents"
    end if

    Ainsi, le if w.document.folder.self.Path = folder then ne
    donnera pas toujours le résultat escompté.

    Pour éviter ça, il faut comparer les chaines dans la même
    casse avec UCase, LCase ou utiliser StrComp, que j'avais
    choisi pour des raisons de flexibilité.

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

Discussions similaires

  1. [FAQ] Fermer tous les formulaires ouverts
    Par guigui5931 dans le forum Contribuez
    Réponses: 19
    Dernier message: 15/02/2024, 16h57
  2. [C#] tester Fenetre déja ouverte?
    Par codez dans le forum Windows Forms
    Réponses: 14
    Dernier message: 28/04/2006, 00h53
  3. Réponses: 7
    Dernier message: 18/04/2006, 19h29
  4. Réponses: 6
    Dernier message: 14/03/2006, 19h44
  5. [VB]donner le focus à une application déja ouverte ou fermée
    Par Nicko29 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 21/01/2006, 14h28

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