notpa01
Messages postés95Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention14 janvier 2012
-
28 févr. 2008 à 10:23
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
5 mars 2008 à 03:25
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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 mars 2008 à 15:43
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
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 28 févr. 2008 à 12:08
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
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.
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 29 févr. 2008 à 02:27
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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 29 févr. 2008 à 12:53
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
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.
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 29 févr. 2008 à 21:34
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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 29 févr. 2008 à 22:10
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
notpa01
Messages postés95Date d'inscriptionmercredi 9 août 2006StatutMembreDernière intervention14 janvier 2012 1 mars 2008 à 16:11
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.