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.