Команда PowerShell не работает при вызове из VBA, но работает иначе - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я не могу использовать xlwings, потому что не могу получить доступ к cmd Windows. Но я могу получить доступ к PowerShell, поэтому я попытался изменить специальный код VBA для xlwings, который вместо этого вызывает cmd для вызова PowerShell.

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

Я пытался сравнить (не работающую) команду, которую VBA передает в PowerShell, с (рабочей) командой, которую я вручную вставляю в терминал PowerShells. Но они выглядят точно так же.

Исходный код xlwings, который вызывает cmd

RunCommand = PythonInterpreter & " -B -c ""import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'" & PYTHONPATH & "')).split(';'); " & PythonCommand & """ "

ExitCode = Wsh.Run("cmd.exe /C " & _
           DriveCommand & RunCommand & _
           """" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & _
           Chr(34) & Application.Path & "\" & Application.Name & Chr(34) & " " & _
           Chr(34) & Application.Hwnd & Chr(34) & _
           " 2> """ & LOG_FILE & """ ", _
           WindowStyle, WaitOnReturn)

И моя слегка модифицированная версия

RunCommand = "C:\ProgramData\Anaconda3\pythonw.exe -B -c ""import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'" & PYTHONPATH & "')).split(';'); " & PythonCommand & """ "

ExitCode = Wsh.Run("Powershell.exe -ExecutionPolicy ByPass -NoExit " & _
           DriveCommand & RunCommand & _
           """" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & _
           Chr(34) & Application.Path & "\" & Application.Name & Chr(34) & " " & _
           Chr(34) & Application.Hwnd & Chr(34) & _
           " 2> """ & LOG_FILE & """ ", _
           WindowStyle, WaitOnReturn)

Результирующая команда из приведенного выше кода. Работает при прямой вставке в терминал PowerShells, не работает при выполнении из VBA:

C:\ProgramData\Anaconda3\pythonw.exe -B -c "import sys, os; sys.path[0:0]=os.path.normcase(os.path.expandvars(r'C:\Users\<placeholder>\test1;')).split(';'); import test1;test1.hello_xlwings()" "C:\Users\<placeholder>\test1\test1.xlsm" "from_xl" "C:\Program Files (x86)\Microsoft Office\Office16\Microsoft Excel" "788640" 2> "C:\Users\<placeholder>\AppData\Roaming\xlwings.log"

Я ожидаю простого "Привет, мир!" в определенной ячейке Excel при нажатии кнопки, связанной с макросом vba. Вместо этого я получаю эту ошибку:

At line:1 char:213
+ ... X0RNZ\test1;')).split(';'); import test1;test1.hello_xlwings() C:\Use ...
+                                                                  ~
An expression was expected after "(".
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedExpression

Если я вставлю команду в терминал PowerShell напрямую, я получу ожидаемый результат: «Привет, мир!» отображается в моей конкретной ячейке Excel.

1 Ответ

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

Вам не хватает параметра -Command.В зависимости от того, что содержит DriveCommand, вы должны добавить -Command перед DriveCommand или RunCommand.

. Убедитесь, что между командами de PowerShell есть точка с запятой, и укажите команду как блок сценария, например:

powershell.exe -ExecutionPolicy ByPass -NoExit -Command { cd "c:\folder";c:\folder\run.exe "param1" "param2" }

Запустите powershell /? для получения дополнительных примеров.

...