SHELL pgm >fic.txt ne marche pas [Résolu]

Signaler
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour,

En VB6, si je code :
Shell "D:\programmes VB\suivi pgm\PSLIST.EXE >file_log.txt"

la commande PSLIST s'exécute bien mais le résultat n'est pas dans le fichier file_log.txt.
Si je mets cette même commande dans un fichier appelé PSL.BAT et que je fasse un shell de ce fichier BAT : SHELL "D:\programmes VB\suivi pgm\PSL.BAT", mon fichier TXT est bien créé.
Pourquoi le résultat ne va pas dans le fichier pointé sur >file_log.txt ?

Nota : PSLIST est est programme de SysInternals disponible dans le WEB qui permet de lister tous les process en cours sous Windows.

Merci de votrer aide.

Notpa01

31 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,

peut-être le nom du chemin pas pris en format long....

çà donne quoi comme çà? :

Option Explicit
'
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As
Long
Private Declare Function MakeSureDirectoryPathExists Lib
"imagehlp.dll" (ByVal lpPath As String) As Long
'
'
Private Sub Form_Load()
    RunPsList "G:\Downloads\PsTools" ',
"-m"
    Unload Me
End Sub
'
'
Private Function RunPsList(ByVal sDir As String, Optional ByVal sArg As String = vbNullString) As Long
    Dim sExe As String, sFile As String
    sExe = GetShortPath(sDir & "pslist.exe")
    sFile = GetShortPath(sDir & "log_activity.txt", True)
    
    If LenB(sArg) Then sArg = " " & sArg & "
"
    
    RunPsList = Shell("cmd.exe /c " & sExe & sArg & ">
" & sFile)
End Function
'
'  
http://www.codyx.org/snippet_recuperer-chemin-fichier-format-short-meme-si-fichier_443.aspx#1448
Private Function GetShortPath(ByVal sFile As String, Optional bCreate As Boolean = False)
As String
    If bCreate Then
        Call MakeSureDirectoryPathExists(Left$(sFile, InStrRev(sFile, "")))
        Dim FF As Integer: FF = FreeFile
        Open sFile For Output As #FF
            Print #FF, vbNullString
        Close #FF
        DoEvents
    End If
    
    Dim lRet As Long
    GetShortPath = String(1024, Chr$(0))
    lRet = GetShortPathName(sFile, GetShortPath, Len(GetShortPath))
    GetShortPath = Left$(GetShortPath, lRet)
    
    If bCreate Then Call DeleteFile(sFile)
End Function

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Dans le titre, il est affiché : >fic.txt et non > fic.txt (signe supérieur).
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3
bonjour,
et ça ?
Shell ""D:\programmes VB\suivi pgm\PSLIST.EXE" ">file_log.txt""

Dom
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Désolé :msg : Erreur de compilation : Attendu : fin d'instruction.

Avec Shell "D:\programmes VB\suivi pgm\PSLIST.EXE " & ">file_log.txt", mon fichier TXT n'est pas créé.

Notpa01
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut
Le  fichier file_log.txt est en principe créé dans le répertoire courant .S'il doit se trouvé ailleurs il faut ajouter le chemin qui y mène. Le  & initial doit être attribué à Pslist
A première vue tout au moins
Amicalement
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

J'avais déjà testé ça :

Shell "D:\programmesVB\suivi pgm\PSLIST.EXE >D:\programmesVB\suivi pgm\file_log.txt"

Le fichier TXT n'est toujours pas créé. J'avais aussi recherché sur tous les disques (C: et D:): pas trouvé.

Losrque je lance mon SHELL, PSLIST s'exécute bien (je le vois dans la barre des tâches), mais pas de création de fichier .TXT

La programme PSLIST accepte des paramètres (mon du process à collecter). C'est pourquoi un SHELL est nécessaire pour passer ce nom de process au programme. Pour le moment, j'utilise le code suivant :

'
' création du fichier .BAT
'
Open App.Path & "\gen_list.bat" For Output As #1
rec = "PSLIST " & z_module & " >>log_activity.txt"
Print #1, rec
Close #1
Shell App.Path & "\gen_list.bat "

La variable
& z_module contient le nom du process à collecter. Et là, mon fichier 
log_activity.tx est bien créé.
Mais c'est un peu lourd.

Merci en tous cas de votre aide.

Notpa01
Messages postés
14683
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2020
144
Bonjour

Correction :
Shell """D:\programmes VB\suivi pgm\PSLIST.EXE"" > file_log.txt"
serait plus juste (Pour un " dans la chaine, il en faut 2 dans le code).

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

OK. Plus d'erreur de syntaxe mais tjrs pas de TXT créé.

Au fait, j'ai testé sous Win/XP SP2 et Vista : c'est pareil....
Messages postés
14683
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2020
144
Bonjour

Et :
Shell """D:\programmes VB\suivi pgm\PSLIST.EXE"" > ""D:\programmes VB\suivi pgm\file_log.txt"""
ne fonctionne pas ?

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Désolé. Tjrs pas....
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,

c'est confut tout çà....
z-module c'est quoi?

Shell "D:\programmes VB\suivi pgm\PSLIST.EXE " & z_module & " >>log_activity.txt"

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut Notpa

Manifestement il y a un problème
 (pour PCPT: z-module est le nom de l'ordinateur distant, en son absence c'est le pc local qui est examiné)

Si on exécute cmd.exe
(Tous les programmes/Accessoire/Invite de commandes),  la commande:

 Pslist >log.txt  s'effectue correctement .

Pour simplifier l'écriture , j'ai modifié les propriétés de cmd afin qu'il s'ouvre dans le répertoire contenant Pslist et donc log.txt

La première fois qu'il est exécuté Pslist affiche une fenêtre d'adhésion aux conditions d'utilisation, ensuite un message de copyright est affiché à chaque fois dans la fenêtre de Cmd et le fichier log reçoit bien les informations.

Il est clair qu"un fichier Bat  se comporte de la même manière,simplement la fenêtre de cmd se fermant automatiquement le message de copyright ne peut pas être vu

Si maintenant avec VB6,  j'exécute la commande Shell " pslist >log.txt" j'obtiens un message d'erreur parce que cmd ne trouve pas Pslist.
 Donc Shell ne tient pas compte des propriétés de cmd.exe.Il faut donc précéder les noms de fichiers par leur chemin
La commande Shell  " chemin\pslist  > chemin\ log.txt" ne produit pas d'erreur  mais le fichier log.txt n'est pas créé. Amusant
Si après quelques essais j'exécute  
   Shell "chemin\pslist  je ne m'amuse plus"
Pslist est exécuté sans erreur  mais tout ce qui suit est manifestement   considéré comme un commentaire sans intérêt.
Shell étant  une fonction on peut donc écrire:
retour=shell ("chemin\pslist >chemin\log.txt") mais le résultat est le même pas de log.
En fait le prototype de shell est:

Public Function Shell( _
   ByVal PathName As String, _
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _
   Optional ByVal Wait As Boolean = False, _
   Optional ByVal Timeout As Integer = -1 _
) As Integer
Est-ce pour cela qu'on ne peut pas rediriger la sortie?
amicalement
Messages postés
14683
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 août 2020
144
Bonjour

A ce moment là, tu peux regarder les sources concernant les pipes des prg console.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Bon, je crois qu'il n'y a pas de solution. Pb VB6 ? Pb Windows ?

Ce n'est pas grave puisque j'ai un bypass. Je laisse tomber et je vais générer mon fichier .BAT puisque ça ça marche.

Merci pour votre aide à tous.

Cordialement.

Notpa01
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
Salut
Avec ceci le fichier est enfin créé:
nom$ = "cmd.exe /c """"c:\utile\psctools\pslist.exe"" -c >""c:\utile\psctools\log.txt"" """


retour = Shell(nom$)
Pourquoi tant de guillemets?
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
notpad01
-> ni problème VB ni Windows...
ce n'est pas le shell ni le programme qui enregistre en externe mais le CMD, c'est pourquoi NHenry te proposait de passer par les PIPE

Guilou34 -> en effet, pourquoi tant de guillemets?...
pas besoin ^^

Option Explicit

Private Sub Form_Load()
    RunPsList "G:\Downloads\PsTools" ',
"-m"
    Unload Me
End Sub

Private Function RunPsList(ByVal sDir As String, Optional ByVal sArg As String = vbNullString) As Long
    Dim sExe As String, sFile As String
    sExe = sDir & "pslist.exe"
    sFile = sDir & "log_activity.txt"
    If LenB(sArg) Then sArg = " " & sArg & "
"
    
    RunPsList = Shell("cmd.exe /c " & sExe & sArg & ">
" & sFile)
End Function

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Si j'essaie

nom$ = "cmd.exe /c """"D:\programmesVB\suivi pgm\PSLIST.EXE"" -c >""D:\programmesVB\suivi pgm\file_log.txt"" """

retour = Shell(nom$)

le fichier est bien créé mais il contient le HELP et non le résultat de PSLIT :

PsList 1.26 - Process Information Lister
Copyright (C) 1999-2004 Mark Russinovich
Sysinternals - www.sysinternals.com

Usage: D:\programmesVB\suivi pgm\PSLIST.EXE [-d][-m][-x][-t][-s [n] [-r n] [\\computer [-u username][-p password][name|pid]
   -d          Show thread detail.
   -m          Show memory detail.
   -x          Show processes, memory information and threads.
   -t          Show process tree.
   -s [n]      Run in task-manager mode, for optional seconds specified.
               Press Escape to abort.
   -r n        Task-manager mode refresh rate in seconds (default is 1).
   \\computer  Specifies remote computer.
   -u          Optional user name for remote login.
   -p          Optional password for remote login. If you don't present
               on the command line pslist will prompt you for it if necessary.
   name        Show information about processes that begin with the name
               specified.
   -e          Exact match the process name.
   pid         Show information about specified process.

Je dois m'absenter. Je testerai plus tard le code de PCPT.

merci et A+

Notpa01
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
BINGO<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





ceci produit bien un log.txt correct:
nom$ = "cmd.exe /c """"c:\utile\psctools\pslist.exe"">""c:\utile\psctools\log.txt"" """
retour = Shell(nom$)

Notpa-> Je n'avais pas été voir  le contenu du fichier créé et donc crié victoire trop tôt.
 En fait
l’option  –c  n’étant pas comprise par  Pslist , elle était considérée comme un commande help.







PCPT -> Je ne  comprends pas bien ceci :






ce n'est pas le shell ni le programme qui enregistre en externe mais le CMD, c'est pourquoi NHenry te proposait de passer par les PIPE








 







Pipe relève de la terminologie  Unix, avec Windows on parle plutôt de redirection mais on utilise les mêmes symboles  > et <. Par ailleurs la solution  proposée n’a pas créé le fichier de sortie, avec ma configuration tout au moins. Il serait interessant de savoir pourquoi.  






 






Le problème de Notpa était celui-ci : pourquoi la redirection fonctionne-t-elle  en mode console ou avec un Batch et non pas avec un Shell ?






 






Quant à ma question sur le nombre de guillemets  nécessaire,elle  doit être comprise dans ce sens :





Pourquoi en supprimant deux guillemets appariés comme, par exemple,  ceux qui encadrent le nom du fichier, un erreur de compilation est-elle  générée ?





Nhenry, lui aussi, d’ailleurs n’était pas avare dans ce domaine.






 






Amitiés à tous.  
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
ce n'est pas le shell ni le
programme qui enregistre en externe mais le CMD, c'est pourquoi NHenry
te proposait de passer par les PIPE











Pipe relève de la terminologie  Unix, avec Windows on parle plutôt de redirection mais on utilise les mêmes symboles  > et <. Par ailleurs la solution  proposée n'a pas créé le fichier de sortie, avec ma configuration tout au moins. Il serait interessant de savoir pourquoi. 



la question n'est ni d'unix ni de symbole mais de.. formalisme, mot étant (uniquement?) utilisé pour donner de bons résultats dans le moteur de recherches

en dotnet il me semble que l'on peut faire des applications de type console, ce qui n'est pas "naturellement" faisable en VB6.
d'où ces sources "PIPE"
c'est pourquoi NHenry le proposait (et je le soutiens ), pour recevoir directement dans l'appli le résultat, permettant alors de poursuivre avec l'enregistrement de fichier. on ne serait plus passé par " > FICHIER_DEST" en argument




Le problème de Notpa était celui-ci : pourquoi la redirection fonctionne-t-elle  en mode console ou avec un Batch et non pas avec un Shell ?






Shell permet de lancer un EXE.
un bat n'est pas un exe
shell n'est pas un exe
cmd en est un
shell ne lance pas cmd par défaut!
pslist est un exe, ne lançant pas de "sauvegarde" même avec arguments

c'est pourquoi lancer le bat (qui LUI lance cmd) ne créait pas le fichier SI on le lance par code (par shell)
c'est pourquoi shell ne créait pas le fichier (en lançant PSLIST)
bat "à la main" le créait
la commande "à la main" DANS une console CMD ouverte le créait

le fichier est créé PAR CMD.EXE, pas par shell ni bat ni pslist





Pourquoi en supprimant deux guillemets appariés comme, par exemple,  ceux qui encadrent le nom du fichier, un erreur de compilation est-elle  générée ?








Nhenry, lui aussi, d'ailleurs n'était pas avare dans ce domaine.



(souriant cette dernière phrase )

ce que tu proposais (tout à fait correct mis à par l'argument, d'où mon "-m" en test/commentaire) est en allégé :

execute -> CMD "COMMANDE"
pour COMMANDE -> "pslist" SYMBOLE_EXPORT "destination"

lu comme çà, il y a des guillemets avant COMMANDE, qui ne sont pas indispensables, simplement

quant au fait que tu aies peut-être eu des erreurs de compil/execution lors de tes tests, tout dépend de quels guillemets tu as supprimé...
tu dis 2, je suppose que c'est de ceux-là que tu parles ("commande"), chez moi (XP PRO SP1 - VB6 SP6) çà a fonctionné du premier coup, plusieurs essais, pas testé avec des guillemets supplémentaires...

je suppose que tu as évidemment mis en argument le bon dossier contenant pslist.exe (malgré la différence de nos dossiers PsTools et psctools) et vérifié avec refresh de l'explorateur, pas de pb de droits éventuels sur cmd (si sous vista)?

quelqu'un d'autre peut-il tester la fonction RunPsList svp et préciser OS / particularité ??

bonne soirée ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
95
Date d'inscription
mercredi 9 août 2006
Statut
Membre
Dernière intervention
14 janvier 2012

Hello,

Je suis désolé mais là je suis un peu largué. Je ne connais pas les "Pipe". Je ne vais pas me prendre la tête avec ça. Je vais générer mon fichier .BAT (comme ja fais actuellement) et faire un Shell de ce fichier car ça marche.

Merci de votre aide à tous.

Cordialement

Notpa01