Запуск Python или PowerShell в VBA Outlook не работает? - PullRequest
2 голосов
/ 15 мая 2019

Я пытаюсь запустить сценарий python, используя VBA в Outlook. Сценарий python предназначен для извлечения некоторых данных с использованием REST API и записи в файл в системе. И я использую VBA, чтобы организовать это, отправляя электронные письма соответствующим людям.

Приведенный ниже скрипт на Python (get_people.py) работает нормально, когда я запускаюсь из ОС Он просто вызывает REST API и получает список имен людей и записывает их в файл в ОС.

Я пробовал два метода:

  1. упаковка python выполнения в Batch файлы с именем getNames.bat:

    #getNames.bat file
     C:\Python37\python.exe "C:\scripts\get_people.py"
    

    и VBA для вызова .bat файлов:

    Sub GetNames()
    
       Dim wsh as Object
       Dim waitOnReturn As Boolean: waitOnReturn = True
       Dim windowStyle As Integer: windowStyle = 1
       Dim sScript As String
    
       Set wsh = VBA.CreateObject("WScript.Shell")
       Set sScript = "C:\scripts\getNames.bat"
       wsh.Run sScript, windowStyle, waitOnReturn
       ... 
       'Rest is reading the content of the file that written by python script and send emails to someone.
       ...
    Exit Sub
    

Тем не менее, запущенная строка Python не работает в VBA, но она запускается, если я выполняю вручную с cmd.exe. В VBA cmd экран быстро всплывает и исчезает.

  1. Запуск сценариев Python непосредственно в VBA:

    Sub GetNames()
    
       Dim wsh as Object
       Dim waitOnReturn As Boolean: waitOnReturn = True
       Dim windowStyle As Integer: windowStyle = 1
       Dim sScript As String
       Dim PyExe As String
       Dim PyScript As String
    
       Set wsh = VBA.CreateObject("WScript.Shell")
       Set PyExe = "C:\Python37\python.exe"
       Set PyScript = "C:\scripts\get_people.py"
    
       wsh.Run PyExe & " " & PyScript
    
       ....
       'This one crashes Outlook
       ...
    
       Exit Sub
    

Я попробовал простые команды Powershell вместо python в файле .bat:

 #getNames.bat file
      C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "Get-Date"

и этот тоже не работает.

Поскольку я не очень разбираюсь в VBA, я ищу помощи, чтобы направить меня в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Я создал код, очень похожий на ваш первоначальный случай, и он работал для меня.Попробуйте поставить «паузу» в конце пакетного файла.

trybat.bat

@echo off
echo "hello world"
pause

VBA-код

Sub Test()

  Dim wsh As Object
  Dim waitOnReturn As Boolean: waitOnReturn = True
  Dim windowStyle As Integer: windowStyle = 1

  Set wsh = VBA.CreateObject("WScript.Shell")

  wsh.Run "C:\testdir\trybat.bat", windowStyle, waitOnReturn
  MsgBox "ran"
End Sub
0 голосов
/ 15 мая 2019

Как насчет следующего?

Option Explicit
Public Sub Example()
    Shell "cmd /k C:\Python37\python.exe C:\scripts\get_people.py", vbmaximizedfocus 
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...