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

VBScript Discussion :

Utiliser une boite dialog pour choix dossier et fichier Win 11 - 64bits


Sujet :

VBScript

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut Utiliser une boite dialog pour choix dossier et fichier Win 11 - 64bits
    Bonjour à toutes et à tous,

    Avec mon Fichier .vbs j'aimerai avec une boite de dialog pouvoir choisir mon dossier et mon fichier plutôt que de les fixer par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ' Définir le chemin du dossier et le nom du fichier
    Dim dossierParent, nomFichier
    dossierParent = "C:\Test\"
    nomFichier = "Test1.jpg"
     
    ' Créer l'objet Shell
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(dossierParent)
    Set objFile = objFolder.ParseName(nomFichier)
     
    WScript.Echo "Fichier : " & objFolder.GetDetailsOf(objFile, 0)
    WScript.Echo "Date prise : " & objFolder.GetDetailsOf(objFile, 161)
    WScript.Echo "Appareil : " & objFolder.GetDetailsOf(objFile, 175)
    J'ai ce code mais malgré mes essais d'adaptation je n'y arrive pas.

    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
     
    Dim objShell, objFolder, strFileName
    Set objShell = CreateObject("Shell.Application")
    ' Ouvre la boîte de dialogue de sélection de fichier
    Set objFolder = objShell.BrowseForFolder(0, "Sélectionnez un fichier :", &H4000)
     
    If Not objFolder Is Nothing Then
        strFileName = objFolder.Self.Path
        MsgBox "Vous avez sélectionné : " & strFileName
    Else
        MsgBox "Aucun fichier sélectionné."
    End If
     
    Set objFolder = Nothing
    Set objShell = Nothing
    @+,

    cincap

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    ton code (le 2nd) fonctionne bien pourtant, mais il ne t'autorise que de sélectionner depuis ton profil utilisateur

    Edit: oups répondu trop vite, effectivement quand on sélectionne un fichier, on a une erreur; il faut passer par un autre composant il me semble)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objFolder = objShell.BrowseForFolder(0, "Sélectionnez un fichier :", &H4000,&H11)
    en complétant avec le paramètre de racine de recherche, on peut accéder à tous les lecteurs (ou autres restrictions selon la valeur)

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    En fait, il faudrait passer par une commande powershell pour passer l'erreur.
    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
    Function PickFile()
        Dim shell, command, executor, filePath
        Set shell = CreateObject("WScript.Shell")
     
        ' Commande PowerShell pour ouvrir la boîte de dialogue de sélection de fichier
        command = "powershell -NoProfile -Command ""Add-Type -AssemblyName System.Windows.Forms; " & _
                  "$f = New-Object System.Windows.Forms.OpenFileDialog; " & _
                  "$f.Filter = 'Tous les fichiers (*.*)|*.*'; " & _
                  "$f.ShowDialog() | Out-Null; $f.FileName"""
     
        ' Exécution et récupération du résultat
        Set executor = shell.Exec(command)
        filePath = executor.StdOut.ReadAll
     
        ' Nettoyage du retour à la ligne
        PickFile = Trim(Replace(filePath, vbCrLf, ""))
    End Function
     
    ' --- Exemple d'utilisation ---
    Dim monFichier
    monFichier = PickFile()
     
    If monFichier = "" Then
        MsgBox "Aucun fichier sélectionné.", vbExclamation
    Else
        MsgBox "Vous avez choisi : " & monFichier, vbInformation
    End If

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    Bonjour à toutes et à tous,

    @ umfred, merci pour ta solution qui fonctionne.

    Comment alors l'intégrer dans ton code en remplacement "dossier parent et nomFichier" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim dossierParent, nomFichier
    dossierParent = "C:\Test\"
    nomFichier = "Test1.jpg"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ' Définir le chemin du dossier et le nom du fichier
    Dim dossierParent, nomFichier
    dossierParent = "C:\Test\"
    nomFichier = "Test1.jpg"
     
    ' Créer l'objet Shell
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(dossierParent)
    Set objFile = objFolder.ParseName(nomFichier)
     
    WScript.Echo "Fichier : " & objFolder.GetDetailsOf(objFile, 0)
    WScript.Echo "Date prise : " & objFolder.GetDetailsOf(objFile, 161)
    WScript.Echo "Appareil : " & objFolder.GetDetailsOf(objFile, 175)
    Sinon pas de tracas je vais fignoler avec D6 car beaucoup de chemin à faire pour mes soins.

    @+,

    cincap

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    un peu de réflexion.
    vu que tu récupères le chemin complet du ficher avec son nom, tu peux utiliser un objet fso pour extraire le nom du dossier et le nom du fichier

    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
    Function PickFile()
        Dim shell, command, executor, filePath
        Set shell = CreateObject("WScript.Shell")
     
        ' Commande PowerShell pour ouvrir la boîte de dialogue de sélection de fichier
        command = "powershell -NoProfile -Command ""Add-Type -AssemblyName System.Windows.Forms; " & _
                  "$f = New-Object System.Windows.Forms.OpenFileDialog; " & _
                  "$f.Filter = 'Tous les fichiers (*.*)|*.*'; " & _
                  "$f.ShowDialog() | Out-Null; $f.FileName"""
     
        ' Exécution et récupération du résultat
        Set executor = shell.Exec(command)
        filePath = executor.StdOut.ReadAll
     
        ' Nettoyage du retour à la ligne
        PickFile = Trim(Replace(filePath, vbCrLf, ""))
    End Function
     
     
    Dim cheminComplet, dossierParent, nomFichier, fso
     
    cheminComplet = PickFile()
    Set fso = CreateObject("Scripting.FileSystemObject")
    dossierParent=fso.GetParentFolderName(cheminComplet)
    nomFichier=fso.GetFileName(cheminComplet)
    Set fso = Nothing ' si plus besoin de l'objet fso
    ...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    Bonjour à toutes et à tous,

    @ umfred, merci de ta répose, oufti je n'aurai jamais été jusque la avec ta solution.

    J'ai testé pour voir si j'avais bien compris et j'ai une erreur (pas de création du fichier Dimensions) mais à mon avis pas avec ta solution mais bien avec ma retranscription.

    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
     
    Function PickFile()
        Dim shell, command, executor, filePath
        Set shell = CreateObject("WScript.Shell")
     
        ' Commande PowerShell pour ouvrir la boîte de dialogue de sélection de fichier
        command = "powershell -NoProfile -Command ""Add-Type -AssemblyName System.Windows.Forms; " & _
                  "$f = New-Object System.Windows.Forms.OpenFileDialog; " & _
                  "$f.Filter = 'Tous les fichiers (*.*)|*.*'; " & _
                  "$f.ShowDialog() | Out-Null; $f.FileName"""
     
        ' Exécution et récupération du résultat
        Set executor = shell.Exec(command)
        filePath = executor.StdOut.ReadAll
     
        ' Nettoyage du retour à la ligne
        PickFile = Trim(Replace(filePath, vbCrLf, ""))
    End Function 
     
    Dim cheminComplet, dossierParent, nomFichier, fso
     
    cheminComplet = PickFile()
    Set fso = CreateObject("Scripting.FileSystemObject")
    dossierParent=fso.GetParentFolderName(cheminComplet)
    nomFichier=fso.GetFileName(cheminComplet)
     
    'J'ai essayé de le désactiver !
    Set fso = Nothing ' si plus besoin de l'objet fso
     
    ' Créer l'objet Shell
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(dossierParent)
    Set objFile = objFolder.ParseName(nomFichier)
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set f=fso.CreateTextFile(dossierParent & "Dimensions.txt",True,True)
     
    'WScript.Echo "Dimensions : " & objFolder.GetDetailsOf(objFile, 161)
    f.WriteLine(objFolder.GetDetailsOf(objFile, 161))
     
    f.Close() 
     
    Set f = Nothing
    Set fso = Nothing
    Set objShell = Nothing
    En tous les cas merci pour ton aide.

    @+,

    cincap

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    "l'erreur" est à mon avis qu'il manque le "" à la fin de la chaine dossierParent et donc qu'il t'a créé un fichier dans le dossier parent de dossierParent en concaténant le nom du dossier et le nom du fichier.
    un exemple pour que ce soit plus clair, si dossierParent est "C:\toto" le script a créé (ou essayé de créer) le fichier "c:\totoDimensions.txt" au lieu du fichier "c:\toto\Dimensions.txt"

    fso dispose de la fonction BuildPath pour s'affranchir du problème (on pourrait aussi rajouter manuellement le séparateur)

    Manuellement, sur la ligne de création de fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set f=fso.CreateTextFile(dossierParent & "\Dimensions.txt",True,True)
    avec la méthode BuildPath
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set f=fso.CreateTextFile(fso.BuildPath(dossierParent, "Dimensions.txt"),True,True)
    Mais encore une fois, ce serait mieux d'indiquer l'erreur réelle, pour être sûr de résoudre le bon problème. (ça pourrait aussi être un problème de droit d'écriture dans le dossier par exemple)

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    @ umfred, super de chez super cela fonctionne merci encore pour tes explications.

    J'ai perdu de vue que le fichier était dans le même dossier et qu'il fallait quand même un contre slash.

    Pour l'erreur qui n'est pas une de codage !

    j'ai une erreur (pas de création du fichier Dimensions)
    Dommage pour la fenêtre dos, on aurait pu le faire en PowerShell mais cela me suffit amplement au niveau de l'apprentissage.

    Bonne journée à toi,

    @+,

    cincap

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    @ umfred, je viens de remarquer dans la sauvegarde du fichier .txt qu'il est encodé en UTF16 au lieu de UTF8 habituellement.

    Tu penses que l'on sait y remédier ?

    @ +,

    cincap

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    tu peux les convertir avec notepad++ normalement (par exemple)

    et mettre false à la place de true dans le dernier argument de createtextfile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set f=fso.CreateTextFile(fso.BuildPath(dossierParent, "Dimensions.txt"),True,False)

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    Bonjour à toutes et à tous,

    @ umfred, merci de ton message.

    tu peux les convertir avec notepad++ normalement (par exemple)

    et mettre false à la place de true dans le dernier argument de createtextfile
    Pour le 1er point je l'avais fait mais c'est deux manipulations.

    Pour le deuxième point j'ai une erreur "Argument ou appel de procédure incorrect" j'ai donc laissé true.

    Pour test j'ai créé un autre fichier de conversion UTF16 vers UTF8.

    Il demande le chemin et convertit tous les fichiers .txt mais peut convertir (*.json,*.html,*.xml,*.js,*.txt,*.css).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Param (
        [Parameter(Mandatory=$True)][String]$SourcePath
    )
     
     
    Get-ChildItem $SourcePath\*  -recurse -Include *.txt | ForEach-Object {
    $content = $_ | Get-Content
     
    Set-Content -PassThru $_.Fullname $content -Encoding UTF8 -Force}
    Je n'ai pas ce problème avec Delphi.

    Enfin tout est bien par rapport à l'objet du topic.

    Je suis étonné que apparemment tu es le seul a avoir donné une solution.

    @+,

    cincap

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 736
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 736
    Par défaut
    @ tous,

    Il demande le chemin et convertit tous les fichiers .txt mais peut convertir (*.json,*.html,*.xml,*.js,*.txt,*.css).
    C'est naturellement le code pour un fichier PowerShell soit .ps1.

    @+,

    cincap

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2006, 16h26
  2. [XSLT]utiliser une feuille xsl pour traiter différents xml
    Par pistache42 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/05/2006, 19h19
  3. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 18h32
  4. Comment utiliser une icône personnalisée pour un composant ?
    Par Bruno75 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/09/2005, 18h24
  5. Utilise une image ISO pour le boot du PC
    Par Furius dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 05/09/2005, 15h02

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