Как вызвать Bash script из VBA (Excel)
Как запустить файл bash
с помощью VBA на MAC OSX
Я пробовал следующий код
location = FolderPath(ThisWorkBook.FullName)
который возвращает текущий каталог за вычетом имени файла.
за которым следует
Shell(location &"runmybatch.sh")
Я сделал это, потому что bash script находится в той же папке, что и таблица Excel.
Ответы
Ответ 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 работает как любой пользователь и с любой переменной среды, которая используется:
-
теперь скопируйте свой простой 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 вызывает этот путь, и скопируйте/вставьте его в команду оболочки выше.