Page 2 sur 3

Re: Lookup table et fichier texte

Publié : mar. 10/mars/2020 7:20
par Marc56
Bonjour JagV12,

Chaque fois que tu tapes CMD, tu relances un nouveau shell (%windir%\system32\cmd.exe) dans le shell (normal, donc un nouvel environnement)
Chaque fois que tu tapes exit, tu ressort de ce shell et revient au précédent

Assez curieusement, même en lançant le premier shell avec /u il est toujours en code 850
Et en plus c'est différent sous Windows 7 ou 10, et même différent entre un 7 Fr et un 7 us! :?

Pour que ton texte Utf-8 s'affiche correctement dans chrome (ou autre), ajoute une ligne d'entête style:
<meta charset="UTF-8">

Maintenant, si tu veux un programme (même console) pour lister les fichiers d'un répertoire vers un fichier, on peut l'écrire directement en PB en une trentaine de lignes. Il y a plein d'exemple sur le forum (chercher dir récursif). Il te suffit ensuite de le mettre dans le menu contextuel.

:wink:

Re: Lookup table et fichier texte

Publié : mar. 10/mars/2020 10:59
par cage
Bonjour,
Voici une solution de base qui fonctionne pour lister les dossiers dans un fichier texte.
Pour que le fichier soit généré, il faut avoir le droit d'écrire dans le dossier parent.
Par exemple, pour lister "C:\Program Files", il faut avoir le droit d'écrire dans C:\ ce qui n'est jamais le cas en principe.
Voici la clé de registre a ajouter a la base de registre:

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory]

[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory\command]
@="getdir.exe \"%1 > _listing.txt\""
Le programme PB est getdir.pb et l'exécutable généré est getdir.exe
Le fichier getdir.exe est copié dans "C:\Windows\System32"

Code : Tout sélectionner

;
;************************************************************************
;Titre      : getdir.pb
;Auteur     : (C) 2020 CAGE
;Date       : 2020/03/010
;Version PB : PureBasic 5.71 LTS (Windows - x86)
;Version PB : PureBasic 5.71 LTS (Windows - x64)
;Compiler Options
;Compiler Options : Executable format: Windows
;Compile/Run      : Create temporary executable in the source directory
;
;Libairies: aucunes
;
; Utilisation avec la base de registre
;
; Windows Registry Editor Version 5.00
; 
; [HKEY_CLASSES_ROOT\Directory\shell\ListDirectory]
; 
; [HKEY_CLASSES_ROOT\Directory\shell\ListDirectory\command]
; @="getdir.exe \"%1 > _listing.txt\""
;
; copier getdir.exe dans C:\Windows\System32
;
;************************************************************************
;

EnableExplicit

OnErrorGoto(?ErrorHandler)

Define count, mydir$, reponse

count = CountProgramParameters()

If count=0 : End #False : EndIf

mydir$ = ProgramParameter(0) ; : Debug mydir$

reponse = MessageRequester("Listing d'un dossier", "Lister le dossier " + mydir$, #PB_MessageRequester_YesNo)

If reponse = #PB_MessageRequester_Yes
  RunProgram("CMD.EXE", "/U /C DIR " + mydir$ + " /A /S /C", "", #PB_Program_Hide)
EndIf

ErrorHandler:

End
Je regarde pour les autres questions.
cage

Re: Lookup table et fichier texte

Publié : mar. 10/mars/2020 12:05
par Marc56
Ressorti d'un fond de disque dur et adaptée (à peu près) à la question, ce programme va effectuer un "dir" (récursif) vers un fichier sans utiliser cmd.
À toi d'adapter ce que tu veux afficher (à partir de la ligne 40)
L'algorithme de base n'est pas de moi, et impossible de trouver l'initiateur.

On lui passe 2 paramètres:
- Le répertoire à lister
- Le nom de fichier liste
(le programme ne vérifie pas la cohérence des paramètres, donc à améliorer)
On peut tester dans l'IDE en mettant 2 paramètres dans les options du compilateur (onglet 2)
Si tu veux qu'il scan le répertoire en cours, tu mets Base_Dir$ = GetCurrentDirectory() en ligne 8

Code : Tout sélectionner

; Dir_Lst
; Quick and dirty listing de fichiers
; Marc56 (code basé sur un tas d'exemples des forums)

Define Base_Dir$, Out_Name$
; On doit passer en paramètre le répertoire source et le nom du fichier de listing
If CountProgramParameters() = 2
    Base_Dir$ = ProgramParameter(0)
    Out_Name$ = ProgramParameter(1)
    If MessageRequester("Voulez-vous créer une liste ?", 
                        "Répertoire: " + Base_Dir$ + #CRLF$ + 
                        "Liste: " + Out_Name$, 
                        #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
        End
    EndIf
Else
    MessageRequester("Paramètres Manquants", 
                     "Paramètre 1: Répertoire de base à Lister" + 
                     #CRLF$ + 
                     "Paramètre 2: Nom du fichier liste")
    End
EndIf

Define hFile
OpenFile(hFile, Out_Name$)

; Procédure récursive de listage de noms de fichier et répertoires
Procedure Scan_Directory(Path$,  ID = 0) 
    If ID = 0 : WriteStringN(hFile, Path$) : EndIf
    If Right(Path$, 1) <> "\" : Path$ + "\" : EndIf
    
    If ExamineDirectory(ID, Path$, "*")
        While NextDirectoryEntry(ID)
            Dir_Name$ = DirectoryEntryName(ID) 
            
            Select DirectoryEntryType(ID)              
                Case #PB_DirectoryEntry_File
                    ; Affichage date + taille + nom
                    Fullname$ = Path$ + Dir_Name$
                    Ligne$ = "   " + 
                             FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", 
                                        GetFileDate(Fullname$, #PB_Date_Modified)) + 
                             "   " + LSet(GetFilePart(Fullname$), 20, " ") + " " + 
                             RSet(FormatNumber(FileSize(Fullname$), 0), 20) 
                    WriteStringN(hFile, Ligne$)
                    
                Case #PB_DirectoryEntry_Directory
                    ; Si c'est un répertoire, alors on reboucle dessus
                    If Dir_Name$ <> "." And Dir_Name$ <> ".."
                        WriteStringN(hFile, #CRLF$ + Dir_Name$)
                        Scan_Directory(Path$ + Dir_Name$, ID + 1) 
                    EndIf     
                    
            EndSelect  
        Wend        
        FinishDirectory(ID)  
    EndIf
EndProcedure

Scan_Directory(Base_Dir$)

CloseFile(hFile)
; MessageRequester("Listage Terminé", "Fichier: " + #CRLF$ + Out_Name$)
; Affichier le listing
RunProgram(Out_Name$)
Si le fichier de liste a une extension associée (ex: .txt) alors il est affiché en fin de listing.

Enjoy

:)

Re: Lookup table et fichier texte

Publié : mar. 10/mars/2020 12:08
par cage
@ cage (je le prononce à l'anglaise, est-ce à cause de l'acteur ou parce qu'en français, c'est enfermant ... ?) : merci pour ce prêt-à-consommer, lire des page de docs pour me rendre compte que j'ai inversé deux paramètres aurait été utile si j'avais voulu approfondir DOS (-like) mais comme ce n'est pas le cas ici, autant profiter des compétences des autres.
CAGE vient des 2 premières lettres de mon nom (CA) et des 2 premières lettres de mon prénom (GErard). De plus étant né au mois d'Aout, je suis du signe du lion et ou trouve t'on encore des lions a notre époque ?
le fichier généré par CMD.EXE /u /c DIR "%1" /A /S /C >"_Listing.txt" s'affiche correctement dans Notepad mais illisible dans Chrome (très pratique pour ce qui est des recherches d’occurrences). Si, dans Notepad, je le sauvegarde sur lui-même en format ANSI (dommage qu'ìl n'y ait pas de raccourci (comme F12 pour UltraEdit) pour ça, sauf erreur), il réduit de taille et devient Chrome compatible. Est-automatisable (encodage UNICODE -> ANSI-ASCII) ?
Tu parles bien de Notepad.exe livré avec Windows ? Si oui, je te conseille plutôt d'utiliser Notepadd++ (https://notepad-plus-plus.org/). Si tu ne veux pas l'installer, tu peux utiliser la version Minimalist (ce qui est mon cas). Notepad++ permet de changer l'encodage des fichiers.
La précédente solution (cmd.exe /c "chcp 1252 & dir "%1" /A /S /C > "_Listing.txt"") ne fonctionne pas (l'encodage reste CP850) sauf si je la décompose dans un batch. Savez-vous pourquoi et quel serait le remède ?
Toujours un problème d'ordre des commandes donc d'héritage.
Essaye avec chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt <== édité, il manquait le dir
Cela devrait aller mieux.
Et une troisième : à l'origine, cette clé de registre permet, par clic droit sur un dossier, d'afficher une entrée Listing au menu contextuel. Si c'est la clé de registre qui exécute CMD.EXE /c DIR "%1" /A /S /C >"_Listing.txt", c'est bien le dossier cliqué qui est listé. Mais si elle renvoie sur un batch (contenant DIR "%1" /A /S /C >"_Listing.txt), c'est le dossier actuel (son parent, donc) qui est listé. Là encore, pourquoi ?
Il aurait fallu que tu nous donne le contenu exact de ton batch pour qu'on puisse comprendre.
J'ai testé ceci avec succès:

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory]

[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory\command]
@="cmd /u /c d:\\users\\admin\\desktop\\listdir.cmd \"%1\""
J'ai déplacé mon bureau dans D:\ et mon login est admin. Le script listdir.cmd est sur mon bureau.
Voici le contenu du fichier batch:

Code : Tout sélectionner

@ECHO OFF
ECHO.
ECHO LIGNE DE COMMANDE ISSUE DU REGISTRE : %0
ECHO.
ECHO PARAMETRE DE LA LIGNE DE COMMANDE   : %1
ECHO.
CHCP
DIR "%1" /A /S /C >"_Listing.txt
ECHO.
PAUSE
Le résultat est tel qu'attendu.
cage

Re: Lookup table et fichier texte

Publié : mar. 10/mars/2020 23:43
par JagV12
cage a écrit :CAGE vient des 2 premières lettres de mon nom (CA) et des 2 premières lettres de mon prénom (GErard).
Ah, "CaGé", d'accord !
cage a écrit :Essaye avec chcp 1252 & cmd /c "%1" /A /S /C > _Listing.txt
Et mon 'DIR' ? j'y tiens à mon 'DIR', moi !

À suivre...

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 0:41
par cage
Et mon 'DIR' ? j'y tiens à mon 'DIR', moi !
Oups, autant pour moi, j'ai oublié de dir
Voici qui est corigé:
Essaye avec chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt
c'est mieux.
Tiens nous au courant.
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 2:38
par JagV12
cage a écrit :Il aurait fallu que tu nous donne le contenu exact de ton batch pour qu'on puisse comprendre.
Pour remplacer la clé CMD.EXE /c DIR "%1" /A /S /C >"_Listing.txt", mon batch ne contenait que DIR "%1" /A /S /C >"_Listing.txt", le but étant de confirmer l'anomalie décrite plus haut (dossier parent vs dossier cliqué) et non pas de résoudre cette histoire de Code Page

Et en réponse au dernier post (de cage), je me suis acharné sur le nombre et la place des guillemets :
  1. chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt, tout nu, ouvre une console et la ferme aussitôt sans autre résultat.
  2. cmd /c "chcp 1252" && dir "%1" /A /S /C > _Listing.txt, idem mais crée un fichier _Listing.txt vide
  3. cmd /c "chcp 1252" && "dir "%1" /A /S /C > _Listing.txt", idem
  4. cmd /k "chcp 1252" && "dir "%1" /A /S /C > _Listing.txt" affiche (dans la console restée ouverte) "Le format du paramètre est incorrect - 1252"
  5. cmd /k chcp 1252 && "dir "%1" /A /S /C > _Listing.txt", affiche sur deux lignes et fautes incluses "Page de code activeà" "La syntaxe du nom de fichier, de rÚpertoire ou de volume est incorrect"
  6. cmd /k chcp 1252 && dir "%1" /A /S /C > _Listing.txt, crée le fichier en CP850 (on le savait) et ajouter dir "L:\Recorded TV\JT" /A /S /C > _Listing.txt dans la console restée ouverte crée le bon fichier en CP1252 mais je crois qu'on le savait aussi
  7. cmd /k "chcp 1252 && dir "%1" /A /S /C > _Listing.txt", se comporte comme sans les guillemets (fichier CP850)
Pourquoi cet acharnement avec les guillemets ? Parce que j'essaie d'interpréter ces passages du fichier d'aide de CMD :
Remarquez que des commandes multiples séparées par le séparateur « && » sont acceptées comme une chaîne si elles sont entre guillemets.

On y lit encore :
1. Si toutes les conditions suivantes sont respectées, alors les guillemets de la ligne de commande sont conservés :
- aucun caractère spécial entre les deux caractères guillemet, un caractère spécial étant : &<>()@^|

et par contre, tout en bas :
Les caractères spéciaux qui requièrent des guillemets sont :
<espace> &()[]{}^=;!'+,`~

Et je suis perdu (et 188 lignes à potasser, merci la punition !)...

Enfin, rassurez-vous, j'ai fait quelque chose d'idiot et sans intérêt... suspens... j'ai essayé (-oui, quoi ? -roulement de tambour)
texte invisible...cmd /c chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt parce que ça n'avait aucun sens et que ça allait contre toute logique (pour moi, la console aurait dû ouvrir une autre console qui, du coup, aurait été CP850, ou y a-t-il héritage ?) et bien c'était la solutionImage 8O :o :D

Je viens de découvrir la couleur et la taille, alors j'en profite... Et si vous ne voyez pas la chaîne qui fonctionne, c'est parce qu'elle est de même couleur que le fond (standard) donc il faut la sélectionner pour qu'elle apparaisse ! En espérant ne pas avoir été trop puéril... (woaaaa bin, si on peut pu rigoler...)

Je reviendrai plus tard sur l'avancement de mes travaux PureBasic parce que j'ai quand même progressé grâce à vous (au pluriel) !

Deux petites questions pour ceux qui ont le malheur (selon moi, avis personnel) d'avoir W10
  • On s'en réjouit ou on s'y fait ?
  • les résultats de cette manip (1 CMD ou 2 CMDs dans la chaîne , soit les points 1 et 7 ci-dessus, les autres tentatives n'ayant pas d'intérêt) sont-ils les mêmes pour vous ?

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 12:40
par cage
Bonjour JagV12,

Je vais essayer sans être trop bavard de t'expliquer le fonctionnement de DOS pour les commandes qui nous occupe.

La console Windows (anciennement DOS) n'est plus aujourd'hui qu'une fenêtre Windows comme toutes les autres.
Parler de DOS est un abus de langage.
Cette fenêtre s'obtient par WIN+R Ouvrir: cmd.exe ou via un menu de Windows en fonction de la version.
Pour tout exécutable Windows, on peut omettre l'extension lors de l'appel d'une commande.
Ce qui veut dire que WIN+R Ouvrir: cmd.exe est équivalant a WIN+R Ouvrir: cmd
Pour connaitre les extensions reconnues dans Windows:
Ouvre une Console (Invite de commandes) et passe la commande echo %PATHEXT%
Tu obtiens quelque chose comme

Code : Tout sélectionner

EBCAGE::ADMIN C:\Users\admin>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

EBCAGE::ADMIN C:\Users\admin>
Quelles sont les commandes consoles/DOS ?
Ouvre une Console (Invite de commandes) et passe la commande help
Tu verras notamment

Code : Tout sélectionner

CMD            Exécute une nouvelle instance de l’interpréteur de commandes de Windows.
L'aide de chaque commande peut-être obtenue par commande /? ou help commande
Ou se trouvent toutes ces commandes ?
Il faut différencier 2 types de commandes, les commandes exécutables et les commandes internes.
1) Les commandes exécutables sont des binaires ".exe ou .com" présents dans Windows
"C:\Windows\System32\chcp.com"
"C:\Windows\System32\cmd.exe"
Les commandes internes sont des commandes disponibles uniquement dans une Console (Invite de commandes)
break, cd, cls, chdir, dir, ... ne peuvent êtres utilisées qu'en mode Console (dans cmd.exe)

Je m’arrête là pour les explications.

Essayons de comprendre ou tu bugue
1. chcp 1252 & cmd /c dir "%1" /A /S /C > _Listing.txt, tout nu, ouvre une console et la ferme aussitôt sans autre résultat.
J'ouvre une Console par WIN+R Ouvrir: cmd.exe

Code : Tout sélectionner

Microsoft Windows [version 10.0.18363.719]
(c) 2019 Microsoft Corporation. Tous droits réservés.

EBCAGE::ADMIN C:\Users\admin>y:

EBCAGE::ADMIN Y:\> chcp 1252 & cmd /c dir "y:\temp" /A /S /C > _Listing.txt
Page de codes active : 1252

EBCAGE::ADMIN Y:\> chcp.com 1252 & cmd.exe /c dir "y:\temp" /A /S /C > _Listing.txt
Page de codes active : 1252

EBCAGE::ADMIN Y:\>
Çà fonctionne comme attendu et j'ai mon fichier _Listing.txt dans Y:\ au format Unicode donc sans caractère bizarre.
Note que je me suis positionné sur mon disque Y: et que j'ai listé le contenu de Y:\Temp.
J'ai un accès complet a Y:
Pourquoi ça fonctionne ?
chcp.com est une commande externe et peut donc être directement appelée depuis n'importe où et notamment de puis la base de registre.
"C:\Windows\System32" étant dans le chemin de recherche, inutile de préciser le chemin lors de l'utilisation.
Afficher le chemin de recherche ou PATH avec echo %PATH%

Code : Tout sélectionner

EBCAGE::ADMIN C:\Users\admin>echo %PATH%
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Livestreamer;C:\WINDOWS\System32\OpenSSH\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NoteBook FanControl\;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;Y:\DOS;Y:\WIN;Y:\YH\PAF\PortableApps\CommonFiles\Java\bin;C:\Users\admin\AppData\Local\Programs\Fiddler;;C:\Users\admin\AppData\Local\Microsoft\WindowsApps

EBCAGE::ADMIN C:\Users\admin>
Conclusion: le cas 1 doit fonctionner
7. cmd /k "chcp 1252 && dir "%1" /A /S /C > _Listing.txt", se comporte comme sans les guillemets (fichier CP850)
Cette commande n'a aucun intérêt car chcp est une commande externe et n'a pas besoin de cmd pour être activée.
De plus, chcp 1252 doit être appelée avant l'ouverture de cmd pour que cmd hérite du changement de page opéré avec chcp 1252
Conclusion: les cas 2 a 7 sont des erreurs de compréhension du fonctionnement des commandes externe/interne.

WINDOWS 10 est un très bon OS quoi qu'en pensent certains.
Si on fait fi de l'interface et de son nouveau menu Démarrer, le reste est totalement identique a Windows XP ou Seven. (Je parles des arcanes de la machine)
Je ne reviendrais pas en arrière pour rien au monde.
Si les menus rebutent certains, il existe des applications qui permettent de retrouver le menu Windows 7, mais franchement, ou est l’intérêt.
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 13:08
par JagV12
cage a écrit :J'ouvre une Console par WIN+R Ouvrir: cmd.exe
Attention, on ne parle pas de la même chose. Moi, je veux, en un clic (droit) et une frappe clavier (la touche L en l'occurrence et la commande s'appelle Listing), lister (dans un fichier sur le dossier parent (celui qui est à l'écran donc), pour ne pas devoir aller le chercher ailleurs), le dossier sur lequel je viens de faire le clic droit. En résumé, un clic, une touche, c'est fait.

Il semble qu'ouvrir une console et y taper sa commande offre plus de possibilités. Avez-vous essayé de mettre une commande dans une (valeur de) clé de registre de type chaîne pour faire cela ? Quelle commande a fonctionné ?

Parce-que, sur mon PC, la seule qui fonctionne sans batch, c'est celle qui conclut mon post précédent.

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:14
par Marc56
Variante simple de listage de répertoire totalement PB (sans utilisation de CMD)
S'utilise dans le menu contextuel de Windows si mise à jour registre
ou en outil ligne de commande.

Code : Tout sélectionner

; DirListing - v1.1 
; Quick and dirty listing de fichiers
; Marc56 (code basé sur un tas d'exemples des forums)

; --- Base de registre 
;Windows Registry Editor Version 5.00
;
;[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory]
;
;[HKEY_CLASSES_ROOT\Directory\shell\ListDirectory\command]
;@="c:\\bat\\DirListing.exe \"%1\""
; --------------------

; Adapter la dernière ligne au nom de programme et emplacement.
; Inutile que le programme soit dans un répertoire du PATH

Define Base_Dir$, Out_Name$
; On doit passer en paramètre le répertoire source 
; passé automatiquement si mis en menu contectuel
If CountProgramParameters() = 1
    Base_Dir$ = ProgramParameter(0)
    Out_Name$ = "Listing.txt" ; ProgramParameter(1)
    If MessageRequester("Voulez-vous créer une liste ?", 
                        "Répertoire: " + Base_Dir$ + #CRLF$ + 
                        "Liste: " + Out_Name$, 
                        #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
        End
    EndIf
Else
    MessageRequester("Paramètres Manquants", 
                     "Paramètre 1: Répertoire de base à Lister" + 
                     #CRLF$ + 
                     "Paramètre 2: Nom du fichier liste")
    End
EndIf

Define hFile
OpenFile(hFile, Out_Name$)

; Procédure récursive de listage de noms de fichier et répertoires
Procedure Scan_Directory(Path$,  ID = 0) 
    If ID = 0 : WriteStringN(hFile, Path$) : EndIf
    If Right(Path$, 1) <> "\" : Path$ + "\" : EndIf
    
    If ExamineDirectory(ID, Path$, "*")
        While NextDirectoryEntry(ID)
            Dir_Name$ = DirectoryEntryName(ID) 
            
            Select DirectoryEntryType(ID)              
                Case #PB_DirectoryEntry_File
                    ; Affichage date + taille + nom
                    Fullname$ = Path$ + Dir_Name$
                    Ligne$ = "   " + 
                             FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", 
                                        GetFileDate(Fullname$, #PB_Date_Modified)) + 
                             "   " + LSet(GetFilePart(Fullname$), 20, " ") + " " + 
                             RSet(FormatNumber(FileSize(Fullname$), 0), 20) 
                    WriteStringN(hFile, Ligne$)
                    
                Case #PB_DirectoryEntry_Directory
                    ; Si c'est un répertoire, alors on reboucle dessus
                    If Dir_Name$ <> "." And Dir_Name$ <> ".."
                        WriteStringN(hFile, #CRLF$ + Dir_Name$)
                        Scan_Directory(Path$ + Dir_Name$, ID + 1) 
                    EndIf     
                    
            EndSelect  
        Wend        
        FinishDirectory(ID)  
    EndIf
EndProcedure

Scan_Directory(Base_Dir$)

CloseFile(hFile)
; MessageRequester("Listage Terminé", "Fichier: " + #CRLF$ + Out_Name$)
; Affichier le listing
RunProgram(Out_Name$)
Testé 8)
(petit bug corrigé qui empêchait l'utilisation sur répertoire avec espace)

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:33
par cage
@JagV12
Je t'ai donné la solution dès le départ
Au final ,la solution est la suivante:

CMD.EXE /U /C DIR "C:\" /A /S /C > "Y:\"_Listing.txt"

CMD.EXE /A donne une sortie au format ansi
CMD.EXE /U donne une sortie au format unicode

/U ou /A doit être le premier paramètre de CMD

Lors de l'ouverture d'une fenêtre cmd, elle est toujours au format ansi
Pour la passer au format unicode, tapez cmd /u dans cette fenêtre.
Voici le contenu du fichier Listing.reg a exécuter en mode admin

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Listing]

[HKEY_CLASSES_ROOT\Directory\shell\Listing\command]
@="CMD.EXE /U /C DIR \"%1\" /A /S /C > _Listing.txt"
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:34
par Ar-S
J'ai loupé un truc ?
Pourquoi ne pas passer par du 100% PB pour lister des fichiers et dossier sérieux ?

Je me suis fait ce listeur de fichier grâce au code de TS-SOFT qui bombarde.

Code : Tout sélectionner

; ---------------------------------------------
;  2019 - SPEEDY LISTER by Ar-S
; Recursive listing by TS-SOFT
; ---------------------------------------------

DisableDebugger

Global lastPath$,Chemin$
Global NewList Files.s()
Global Mode,Chem
Global.s Duree
Global.b GO = 0 
Global NBF = 0

Declare BrowseDirectory(sPath.s, *pClbFound = 0)
Declare MyFiles(Type, Name$)
Declare WinD()
Declare.s GetPath()
Declare ListFiles()
Define count, time, time2

Prototype clbSearchFile(lType.l, sName.s)

Procedure BrowseDirectory(sPath.s, *pClbFound = 0)
  Protected lDicID.l, qFiles.q, sDirName.s
  Static pCallBack.clbSearchFile
  
  If (Right(sPath, 1) <> "\"): sPath + "\"  : EndIf
  If (Not pCallBack): pCallBack = *pClbFound: EndIf
  
  lDicID = ExamineDirectory(#PB_Any, sPath, "*.*")
  If lDicID
    While NextDirectoryEntry(lDicID)
      qFiles + 1
      
      If DirectoryEntryType(lDicID) =  #PB_DirectoryEntry_File
        If Not pCallBack(1, sPath + DirectoryEntryName(lDicID))
          Break
        EndIf
        
      Else
        sDirName = DirectoryEntryName(lDicID)
        
        If (sDirName <> ".") And (sDirName <> "..")
          
          If pCallBack(2, sPath + sDirName)   
            qFiles + BrowseDirectory(sPath + sDirName)
          Else
            Break
          EndIf
        EndIf
      EndIf
    Wend
    
    FinishDirectory(lDicID)
    ProcedureReturn qFiles
  EndIf
EndProcedure



Procedure MyFiles(Type, Name$)
  Shared Files.s()
  If Type = 2
    ProcedureReturn #True
    
  Else
    AddElement(Files())
    Files() = Name$
    ProcedureReturn #True
  EndIf
EndProcedure


Procedure WinD()
  
  If OpenWindow(0, 0, 0, 220, 100, "Speedy Lister", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StickyWindow(0,1)
    ButtonGadget  (1, 10, 10, 200, 30, "Choisir le répertoire à lister")
    CheckBoxGadget(2, 10, 51, 210, 20, "Inscrire chemin complet")
    CheckBoxGadget(3, 10, 73, 210, 20, "Ne pas afficher les extensions de fichier")
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event

        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1 
              ListFiles()
              
              ; Chemin complet
           Case 2
              Chem = GetGadgetState(2)
              
              ; Extension
            Case 3
              Mode = GetGadgetState(3)
              
          EndSelect
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure


Procedure.s GetPath()
  
  If lastPath$ = ""
    CheminInitial$ = "C:\"
  Else
    CheminInitial$ = lastPath$
  EndIf
  
  Chemin$ = PathRequester("Choisissez un répertoire", CheminInitial$)
  If Chemin$
    SetWindowTitle(0,"Travail en cours")
    ReturnPath$ = Chemin$
  Else
    ReturnPath$ = ""
  EndIf
  
  ProcedureReturn ReturnPath$
  
EndProcedure




Procedure ListFiles()
  
 
  
  NewPath$ = GetPath()
  If NewPath$ <> ""
    NBF = 0 : count = 0
    start = ElapsedMilliseconds()
    HideWindow(0,1)
    count = BrowseDirectory(NewPath$, @MyFiles())
    
    Fin = ElapsedMilliseconds() - start
    If Fin > 1000
      duree.s = StrD (Fin/1000,3) + " sec"
    Else
      Duree.s = Str(Fin) + " ms"
    EndIf
    
    Filtre$ = "Texte (*.txt)|*.txt"
    Fichier$ = SaveFileRequester("Choisissez un fichier à sauvegarder", Chemin$, Filtre$, 0)
    If Fichier$
      If Right(Fichier$,4) <> ".txt" : Fichier$+".txt" : EndIf
      
      If CreateFile(0,Fichier$,#PB_Unicode)
        ForEach Files()
          Short.s = GetFilePart(Files())
          Long.s = Files()
          
          If GetFilePart(Files(),#PB_FileSystem_NoExtension) <> "Thumbs" And GetFilePart(Files()) <> "desktop.ini"
            NBF+1
            
            If Chem = #PB_Checkbox_Unchecked
              commande.s = Short
            ElseIf Chem = #PB_Checkbox_Checked
              commande.s = Long 
            EndIf  
              
            If Mode = #PB_FileSystem_NoExtension
                commande.s = Left(commande,Len( commande )-4) 
            EndIf
              
          
            
            WriteStringN (0, commande,#PB_Unicode)
            
          EndIf
          
        Next
        CloseFile(0)
        
      EndIf
      
      MessageRequester("Resultat",  Str(NBF)+" fichier(s) listé(s) en "+duree)
      SetWindowTitle(0,"Travail terminé")
      HideWindow(0,0)
      
    Else
      MessageRequester("result", "Erreur de création de fichier")
      End
    EndIf
    
  Else
    MessageRequester("Information", "La sélection a été annulée.", 0)
  EndIf

EndProcedure



WinD()

Mon lecteur C:
612 203 fichiers en 6,4s
(Sur SSD 970 pro avec un Ryzen 3700x ça aide aussi)

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:41
par cage
Bonjour Ar-S,
Compare la simplicité de la solution ci dessous avec la complexité d'un exe PB
Tu fournis a ton client le fichier reg, il l'exécute et c'est terminé.
Voici le contenu du fichier Listing.reg a exécuter en mode admin
Code:

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Listing]

[HKEY_CLASSES_ROOT\Directory\shell\Listing\command]
@="CMD.EXE /U /C DIR \"%1\" /A /S /C > _Listing.txt"
cage

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:46
par Ar-S
@cage
- Faire appel à la BDregistre dans une entreprise ne sera pas forcément possible.
- Ici une solution autonome.
à ton client tu lui files un exe avec une GUI (ou pas selon besoin). Il le lance et c'est tout..

Si ton client souhaite changer de dossier faut qu'il édit le batch ? C'est pas plus simple pour le client, c'est plus simple pour le créateur du batch de procéder ainsi.
Avec une GUI tu peux justement personnaliser la chose. Extension oui/non, chemin relative ou pas etc..

Re: Lookup table et fichier texte

Publié : mer. 11/mars/2020 14:49
par cage
La demande de JagV12
Attention, on ne parle pas de la même chose. Moi, je veux, en un clic (droit) et une frappe clavier (la touche L en l'occurrence et la commande s'appelle Listing), lister (dans un fichier sur le dossier parent (celui qui est à l'écran donc), pour ne pas devoir aller le chercher ailleurs), le dossier sur lequel je viens de faire le clic droit. En résumé, un clic, une touche, c'est fait.