2012-06-14 60 views
14

¿Cómo puedo ejecutar un archivo bash utilizando VBA en MAC OSXCómo llamar a un script Bash de VBA (Excel)

He probado el siguiente código

location = FolderPath(ThisWorkBook.FullName) 

que devuelve el directorio actual menos el archivo nombre.

seguido por

Shell(location &"runmybatch.sh") 

he hecho porque la escritura del golpe se encuentra dentro de la misma carpeta que la hoja de cálculo Excel.

+1

¿Esta pregunta ayuda http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac –

+0

no es necesario que incluya un "\" char entre la ubicación y el nombre del guion? Buena suerte. – shellter

+2

El comando "Shell" requiere una ruta ':' separada, aunque este no es el problema. Probé una llamada simple de Shell con una ruta de acceso totalmente calificada que apunta a un archivo de shell bash con el modo 755, en el mismo directorio que el libro de Excel, y siempre obtengo un error de permiso denegado. Esto parece bastante fácil pero tampoco puedo hacerlo funcionar. –

Respuesta

1

No utilicé el comando FolderPath, parece que no está disponible para mí, así que investigaré más tarde por qué no. A continuación se muestra un ejemplo de código que he probado para asegurarme de que es posible ejecutar un archivo .sh desde OSX Excel.

El archivo .sh Solía ​​ensayo se colocó en mi escritorio y sólo contiene la siguiente línea: "abierta /Applications/Calculator.app"

El código VBA para invocar el .sh desde Excel en OSX es a continuación:

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) 

decidí comprobar si su sólo actúa en ciertas carpetas así que moví el archivo .sh a la carpeta/tmp y no podía ejecutar el archivo, "errores de archivo no encontrado" simplemente se no importa cuán Codifiqué el camino. Finalmente me di cuenta de que el archivo/tmp en OSX es un enlace simbólico que se asigna a/private/tmp y cuando utilicé esa ruta, todo parece funcionar bien nuevamente.

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

De todos modos, espero que ayude un poco. Continuaré buscando una mejor manera, necesito algo para encontrar dinámicamente cuál es la ubicación del archivo de manera confiable.

0

No tengo instalado MS Office para Mac, por lo que no puedo probar la respuesta que propongo. Supongo que debería ser posible llamar a Bash el binario (es decir,/bin/bash) y pasar el nombre del script que desea ejecutar como argumento. Esto evitaría cualquier problema con los bits de permiso, y garantizaría que el nombre de ruta para el segundo argumento sea el habitual estilo Unix/-separado. Para el primer argumento, podría ser suficiente llamar a bash por su nombre, sin ninguna ruta, ya que debería usar la variable de entorno PATH.

Con todo, y aún sin pruebas, me gustaría probar este:

Shell("bash runmybatch.sh") 

O, si eso no funciona debido al directorio de trabajo incorrecta,

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

donde la ubicación es la ruta/-separated al directorio del libro de trabajo. Las comillas deben ocuparse de cualquier espacio u otros caracteres exóticos en el camino.

3

¡Hay un par de sorpresas que lo hacen complicado!

  1. El función Shell espera caminos a estar separados por :, directorio no /
  2. Cuando se ejecuta el script, tendrá la raíz (/) como directorio de trabajo

Aparte de eso, debería poder ejecutar un script bash usando el comando Shell. Aquí hay instrucciones paso a paso para que comiences.

  • crear la siguiente escritura del golpe en su directorio de escritorio y el nombre de test.sh:
#!/bin/bash 
open /Applications/Calculator.app/ 
  • Asegúrese test.sh es ejecutable (desde una Terminal ventana, chmod + x test.sh)
  • Probar ru nning (tipo ./test.sh en Terminal). La aplicación de calculadora debería aparecer. Sal de eso.
  • Ejecutar Excel y crear un nuevo libro de trabajo, Workbook1.
  • Guardar este libro en blanco en el directorio escritorio como un libro habilitado para macros
  • Ejecutar VB: Herramientas> Macro> Editor de Visual Basic
  • Si la ventana inmediata no se muestra, Ver> ventana inmediata
  • En la ventana inmediata, escriba el siguiente código VBA:
Shell ActiveWorkbook.Path & ":test.sh" 
  • La aplicación de calculadora debe ejecutar.
2

no he tenido suerte con el comando shell, pero aquí es lo que funcionó para mí a través de AppleScript en Excel 2011:

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

me ha sido necesario para tener el guión utilizar un tinglado de '#!/usr/bin/env ruby' (después de la instalación de la versión de rubí manager)

Para hacer frente a un archivo que se encuentra en una subcarpeta de la carpeta del archivo de llamada, utilice esto:

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

Esto devuelve una ruta con :, que creo que se debe convertir a / para el do shell script.Esto se puede hacer con AppleScript, quoted form of POSIX path of FilePathName_s, o con VBA FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")

1

También tuve problemas para hacer funcionar mi script bash simple, aunque lo tenía en la ruta global (/ usr/bin) y todos los usuarios tenían leer y ejecutar permisos. Dos cosas causaron que mi secuencia de comandos fallara: permisos y rutas debido a las diferencias entre el entorno AppleScript y el entorno bash de mi usuario. La discusión a través del VBA Shell function in Office 2011 for Mac me resultó más útil para resolver mi problema. Este es el proceso en el que eventualmente me decidí.

Como Excel enmascaraba los detalles subyacentes, le recomiendo usar el Editor de AppleScript, que con suerte le da una mejor visión durante la solución de problemas de los errores sin sentido de Excel que vi:

  1. Uso Editor AppleScript para confirmar que la secuencia de comandos en realidad funciona como cualquier usuario y con cualquier variable de entorno que pasa a ser utilizado:

    1. en proyector, empiece a escribir "editor de AppleScript" hasta que aparece y haga clic en él
    2. Crear un nuevo archivo Editor AppleScript
    3. Escriba su script sencillo en el nuevo archivo sin duplicar las comillas dobles - mina de lecturas

      do shell script "parseCsvAndOpen.sh" 
      
    4. pulsa el botón "Ejecutar" para su escritura
    5. localizar a cualquier problema, realice cambios y repita presionando el botón "Ejecutar" hasta que lo ejecute desde el Editor de AppleScript
      • La buena noticia es que tiene una búsqueda más estrecha si que tenga que volver a StackOverflow o Google en busca de ayuda ;-)
  2. Ahora copia la secuencia de comandos simple a partir de AppleScript Editor a la VBA y confirmar que todavía funciona

    1. pude acaba de duplicar mis comillas dobles y ponerlo entre comillas dobles después del código MacScript:

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

      Eso es de hecho uno, dos, tres y luego haga doble qu ota personajes! (Presumiblemente escapar de las comillas dobles)

0

Lo que hay que hacer es escribir el siguiente comando en la macro VBA:

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

(Recuerde incluir comillas dobles que rodean el camino)

La mejor manera de obtener la ubicación de su script es grabar una macro para guardar un libro en la misma carpeta donde reside su script bash. De esta forma, más adelante podrá ver cómo Excel llama a esa ruta y copiarla/pegarla en el comando de shell anterior.

+0

que no funcionará en OSX – ekkis

1

Al principio, el excelente tutorial de Joel no funcionó para mí (en OS X 10.11.6 y Excel para Mac 2011).Después de algunas investigaciones, descubrí que mi problema fue causado por "atributos extendidos" en mi archivo de script, test.sh. En la Terminal, ls -l test.sh rendimientos:

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

Tenga en cuenta que "@" indica la presencia de atributos de archivo extendidos. Más información se da mediante la invocación de ls [email protected] test.sh, lo que da:

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

En otras palabras, dependiendo de cómo se haya creado el archivo, que puede o no puede tener los atributos extendidos. Así que me quité los atributos extendidos a través de xattr -c test.sh, y luego la llamada de Joel: Shell ActiveWorkbook.Path & ":test.sh" funcionó a la perfección! Muchas gracias a todos.

____

Más tarde supe que el ahorro de la secuencia de comandos shell sin escribir los atributos extendidos es posible en TextWrangler por primera invocación defaults write com.barebones.textwrangler WriteExtendedAttributes never en la Terminal. Sin embargo, esto solo evita la adición del atributo com.apple.FinderInfo; el atributo com.apple.TextEncoding permanece. Afortunadamente, sin embargo, el comando VBA Script de Joel ahora funciona cuando el script de shell tiene solo el atributo extendido com.apple.TextEncoding. ¡Entonces, TextWrangler es el editor para mí!

Cuestiones relacionadas