Как вызвать Bash script из VBA (Excel) - программирование
Подтвердить что ты не робот

Как вызвать Bash script из VBA (Excel)

Как запустить файл bash с помощью VBA на MAC OSX

Я пробовал следующий код

location = FolderPath(ThisWorkBook.FullName) 

который возвращает текущий каталог за вычетом имени файла.

за которым следует

Shell(location &"runmybatch.sh")

Я сделал это, потому что bash script находится в той же папке, что и таблица Excel.

4b9b3361

Ответ 1

Есть несколько сюрпризов, которые делают это сложным!

  • Функция Shell ожидает, что пути будут разделены с помощью :, а не /
  • При запуске script он будет иметь корневую директорию (/) в качестве рабочего каталога

Кроме этого, вы можете запустить bash script с помощью команды Shell. Ниже приведены пошаговые инструкции, которые помогут вам начать работу.

  • Создайте следующий bash script в своем рабочем каталоге и назовите его test.sh:
#!/bin/bash
open /Applications/Calculator.app/
  • Убедитесь, что test.sh является исполняемым (из окна терминала, chmod + x test.sh)
  • Попробуйте запустить его (введите ./test.sh в Terminal). Появится приложение калькулятора. Выйдите из этого.
  • Запустите Excel и создайте новую книгу Workbook1.
  • Сохраните эту пустую книгу в каталоге Рабочий стол в качестве Макроориентированной книги
  • Запустить VB: Инструменты > Макро > Редактор Visual Basic
  • Если немедленное окно не отображается, Вид > Немедленное окно
  • В ближайшем окне введите следующий код VBA:
 Shell ActiveWorkbook.Path & ":test.sh"
  • Приложение калькулятора должно работать.

Ответ 2

Мне не повезло с командой оболочки, но вот что для меня работало с помощью applescript в Excel 2011:

script_s = "do shell script ""/Users/user/path/to/script/rubyscript_09.rb"""
MacScript script_s

Мне было необходимо, чтобы script использовал shebang '#!/usr/bin/env ruby' (после установки менеджера версий ruby)

Чтобы обратиться к файлу, находящемуся в подпапке папки вызывающего файла, используйте это:

FilePathName_s = ThisWorkbook.Path & ":subfolder:filename"

Это возвращает путь с : 's, который, я считаю, должен быть преобразован в / для do shell script. Это можно сделать с помощью AppleScript, quoted form of POSIX path of FilePathName_s или с помощью VBA FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")

Ответ 3

Я не использовал команду FolderPath, ее, похоже, не применимо для меня, поэтому я буду исследовать позже, почему бы и нет. Ниже приведен пример кода, который я тестировал, чтобы убедиться, что можно запустить .sh файл из OSX Excel.

Файл .sh, который я использовал для тестирования, был помещен на мой рабочий стол и содержит только следующую строку: "open/Applications/Calculator.app"

Код VBA для вызова .sh из Excel в OSX приведен ниже:

Dim DesktopFolder As String
DesktopFolder = MacScript("return (path to desktop folder) as string")

Dim ScriptFile As String
ScriptFile = DesktopFolder & "test.sh"

RetVal = Shell(ScriptFile, vbNormalFocus)

Я решил проверить, является ли его единственный функционал в определенных папках, поэтому я переместил файл .sh в папку /tmp и не смог выполнить файл, просто получил "файл не найденных ошибок" независимо от того, как я закодировал путь. Наконец, понял, что файл /tmp на OSX является символической ссылкой, которая отображается в /private/tmp, и когда я использовал этот путь, все это, похоже, снова работает отлично.

Dim ScriptFile As String
ScriptFile = "Macintosh HD:private:tmp:test.sh"
RetVal = Shell(ScriptFile, vbNormalFocus)

В любом случае, надеюсь, что это поможет. Я буду продолжать искать лучший способ, нужно что-то, чтобы динамически найти, что местоположение файла надежно.

Ответ 4

У меня также возникла проблема с работой моего простого bash script, хотя я имел его на глобальном пути (/usr/bin), и у всех пользователей были права на чтение и выполнение. Две вещи вызвали сбой script: разрешения и пути из-за различий между средой AppleScript и моей пользовательской средой bash. Я нашел дискуссию в функции VBA Shell в Office 2011 для Mac более полезной при решении моей проблемы. Вот процесс, в который я в конце концов обосновался.

Поскольку Excel маскировал основные сведения, я рекомендую использовать редактор AppleScript, который, надеюсь, дает лучшее понимание во время устранения неполадок, чем бессмысленные ошибки Excel, которые я видел:

  • Используйте редактор AppleScript, чтобы подтвердить, что script работает как любой пользователь и с любой переменной среды, которая используется:

    • В центре внимания, начните вводить "applescript editor" до тех пор, пока он не появится, а затем нажмите на него.
    • Создайте новый файл редактора AppleScript
    • Введите свой простой script в новый файл без удвоения двойных кавычек - мои чтения

      do shell script "parseCsvAndOpen.sh"
      
    • Нажмите кнопку "Запустить" для своего script
    • Отслеживать любые проблемы, вносить изменения и повторять нажатие кнопки "Запустить" до тех пор, пока вы не сможете выполнить ее из редактора AppleScript
      • Хорошая новость заключается в том, что у вас есть более узкий поиск, если вам нужно вернуться в StackOverflow или Google за помощью; -)
  • теперь скопируйте свой простой script из AppleScript Editor в ваш vba и подтвердите, что он все еще работает

    • Мне удалось удвоить двойные кавычки и поместить его в двойные кавычки после кода MacScript:

      MacScript "do shell script ""parseCsvAndOpen.sh"""
      

      Это действительно один, два, а затем три символа двойной кавычки! (предположительно, избегая двойных кавычек)

Ответ 5

Сначала отличный учебник Joel не работал у меня (на OS X 10.11.6 и Excel для Mac 2011). После некоторого слежения я обнаружил, что моя проблема вызвана "расширенными атрибутами" в моем файле script, test.sh. В терминале ls -l test.sh:

  [email protected] 1 tgk  staff  456 Mar 16 13:12 test.sh

Обратите внимание, что "@" указывает на наличие расширенных атрибутов файла. Дополнительная информация дается вызовом ls [email protected] test.sh, который дает:

[email protected] 1 tgk  staff  456 Mar 16 13:12 test.sh
      com.apple.FinderInfo   32 
      com.apple.TextEncoding     15

Другими словами, в зависимости от того, как был создан файл, он может иметь или не иметь расширенные атрибуты. Поэтому я разделил расширенные атрибуты с помощью xattr -c test.sh, а затем Joel call: Shell ActiveWorkbook.Path & ":test.sh" работал отлично! Огромное спасибо всем.

____

Позже я узнал, что сохранение оболочки script без записи расширенных атрибутов возможно в TextWrangler, сначала вызвав defaults write com.barebones.textwrangler WriteExtendedAttributes never в Terminal. Однако это предотвращает добавление атрибута com.apple.FinderInfo; атрибут com.apple.TextEncoding остается. К счастью, однако, команда Joel VBA script теперь работает, когда оболочка script имеет только расширенный атрибут com.apple.TextEncoding! Итак, TextWrangler - редактор для меня!

Ответ 6

У меня нет MS Office для Mac, поэтому я не могу проверить ответ, который я предлагаю. Я полагаю, что можно было бы назвать Bash двоичным (то есть /bin/ bash) и передать имя script, которое вы хотите выполнить в качестве аргумента. Это позволит избежать любых проблем с битами разрешения и будет гарантировать, что имя пути для второго аргумента является обычным Unix-style/-separated. Для первого аргумента может быть достаточно вызвать Bash по его имени без какого-либо пути, так как это должно использовать переменную среды PATH.

В целом, и все еще без тестирования, я бы попробовал это:

Shell("bash runmybatch.sh")

Или, если это не работает из-за неправильного рабочего каталога,

Shell("bash '" & location & "/runmybatch.sh'")

где location - это путь/-сепаратированный путь к каталогу книги. Кавычки sngle должны заботиться о любых пробелах или других экзотических символах на пути.

Ответ 7

Что вам нужно сделать, так это написать следующую команду в макросе VBA:

Shell "C:Path\to\script\location\script.sh"

(Не забудьте включить двойные кавычки, окружающие путь)

Лучший способ получить ваше местоположение script - записать макрос, чтобы сохранить книгу в той же папке, где находится ваш bash script. Таким образом, вы можете позже увидеть, как Excel вызывает этот путь, и скопируйте/вставьте его в команду оболочки выше.