lancer des commandes shell Unix depuis VBA

nazgul64

XLDnaute Nouveau
Bonjour,

Je suis novice en VBA, et après de longues et multiples recherches, je n'ai toujours pas trouvé de réponse claire à :

Est-il possible d'envoyer des lignes de commandes shell Unix sur un serveur Unix depuis une macro VBA sous Excel :confused:

Le contexte : je travaille essentiellement sous Excel et VBA et j'ai de nombreuses applications qui tournent sous un serveur Unix (que je pilote via un émulateur Hummingbird Exceed)

J'ai réussi à trouver quelques exemples simples pour faire du ftp via excel mais je n'ai pas suffisament d'infos (liste commandes OLE ??) pour exécuter des commandes.

Je serais ravi de toute l'aide que vous pourriez m'apporter ! ... j'en suis arrivé à douter que cela soit possible:p

A vous les pros :D
 

grosloulou

XLDnaute Nouveau
Re : lancer des commandes shell Unix depuis VBA

C'est peut-être un peu tard pour toi, mais ça servira à d'autres.

Commencer par télécharger l’exécutable plink à l’adresse suivante :

Le copier dans un répertoire définitif (ex : « C:\USERS\XXXXX\Mes exécutables »),
Enfin, créer par exemple la macro suivante pour générer un fichier "toto" (en marquant "test" dedans) sur le serveur "serveur_unix" en tant qu'utilisateur "user" dont le mot de passe sur le serveur "serveur_unix" est "password":

Sub LancerCommandeUnix()

login = "user"
mot_de_passe = "password"
commande = "echo test > toto"
serveur = "serveur_unix"
ligne = "C:\USERS\XXXXX\Mes exécutables\plink.exe -l " & login & " -pw " & mot_de_passe & " " & serveur & " " & commande
Call Shell(ligne, 0)

End Sub​

Ca c'est si tu veux lancer une commande en asynchrone. Si tu souhaites ne récupérer la main qu'après avoir fini ta commande, c'est un peu plus compliqué. Il te faut copier le code suivant dans un autre module:

Public Const SEE_MASK_DOENVSUBST As Long = &H200
Public Const SEE_MASK_IDLIST As Long = &H4
Public Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
Public Const SW_HIDE As Long = 0
Public Const SW_SHOW As Long = 5
Public Const WAIT_TIMEOUT As Long = 258&
Public Type SHELLEXECUTEINFOA
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Public Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long


Public Function ExecCmd(ByRef vsCmdLine As String, Optional ByRef vsParameters As String, Optional ByRef vsCurrentDirectory As String = vbNullString, Optional ByVal vnShowCmd As Long = SW_HIDE, Optional ByVal vnTimeOut As Long = 200) As Long
Dim lpShellExInfo As SHELLEXECUTEINFOA
With lpShellExInfo
.cbSize = Len(lpShellExInfo)
.lpDirectory = vsCurrentDirectory
.lpVerb = "open"
.lpFile = vsCmdLine
.lpParameters = vsParameters
.nShow = vnShowCmd
.fMask = SEE_MASK_DOENVSUBST Or SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_IDLIST
End With
If ShellExecuteEx(lpShellExInfo) Then
Do While WaitForSingleObject(lpShellExInfo.hProcess, vnTimeOut) = WAIT_TIMEOUT
DoEvents
Loop
GetExitCodeProcess lpShellExInfo.hProcess, ExecCmd
CloseHandle lpShellExInfo.hProcess
Else
ExecCmd = vbError
End If
End Function​

Après, c'est très simple, tu remplaces:
ligne = "C:\USERS\XXXXX\Mes exécutables\plink.exe -l " & login & " -pw " & mot_de_passe & " " & serveur & " " & commande
Call Shell(ligne, 0)​
par:
toto = ExecCmd("C:\USERS\XXXXX\Mes exécutables\plink.exe", " -l " & login & " -pw " & mot_de_passe & " " & serveur & " " & commande)​

Enfin, si tu veux récupérer une sortie de ta commande passée sous ton serveur "serveur_unix", le seul moyen que j'ai trouvé est de mettre la sortie dans un fichier, de transférer le fichier en utilisant la commande ftp de windows (utiliser là aussi ExecCmd pour appeler ftp.exe depuis VBA) et de le lire.
Je pense avoir fait le tour.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 017
Messages
2 084 631
Membres
102 620
dernier inscrit
Sonic4429