如何在MAC OSX上使用VBA运行bash
文件
我尝试了以下代码
location = FolderPath(ThisWorkBook.FullName)
返回当前目录减去文件名。
接着是
Shell(location &"runmybatch.sh")
我这样做是因为bash脚本与excel电子表格位于同一文件夹中。
答案 0 :(得分:3)
有一些令人惊讶的惊喜!
除此之外,您应该能够使用 Shell 命令运行bash脚本。以下是帮助您入门的分步说明。
#!/bin/bash open /Applications/Calculator.app/
Shell ActiveWorkbook.Path & ":test.sh"
答案 1 :(得分:2)
我对shell命令没有运气,但是这里通过Excel 2011中的applescript对我有用:
script_s = "do shell script ""/Users/user/path/to/script/rubyscript_09.rb"""
MacScript script_s
我发现有必要让脚本使用'#!/usr/bin/env ruby
'的shebang(在安装ruby版本管理器之后)
要解决调用文件文件夹子文件夹中的文件,请使用:
FilePathName_s = ThisWorkbook.Path & ":subfolder:filename"
这将返回:
的路径,我认为必须将其转换为/
的{{1}}。这可以使用AppleScript do shell script
或VBA quoted form of POSIX path of FilePathName_s
答案 2 :(得分:1)
我没有使用FolderPath命令,它似乎不适合我,所以我稍后会调查为什么不。下面是我测试的一些示例代码,以确保可以从OSX Excel运行.sh文件。
我以前测试的.sh文件放在我的桌面上,只包含以下行:“open /Applications/Calculator.app”
在OSX上从Excel调用.sh的VBA代码如下:
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文件夹并且无法执行该文件,无论我如何编码路径,只是得到“文件未找到错误”。终于意识到OSX上的/ tmp文件是映射到/ private / tmp的符号链接,当我使用该路径时,它似乎再次正常工作。
Dim ScriptFile As String
ScriptFile = "Macintosh HD:private:tmp:test.sh"
RetVal = Shell(ScriptFile, vbNormalFocus)
无论如何,希望它有所帮助。我将继续寻找更好的方法,需要一些东西来动态地找到文件位置的可靠性。
答案 3 :(得分:1)
我也很难让我的简单bash脚本工作,即使我在全局路径(/ usr / bin)上有它,并且所有用户都具有读取和执行权限。有两件事导致我的脚本失败:由于AppleScript环境与用户的bash环境之间的差异导致的权限和路径。我发现VBA Shell function in Office 2011 for Mac的讨论更有助于解决我的问题。这是我最终确定的过程。
由于Excel掩盖了底层细节,我建议使用AppleScript编辑器,这有助于在您的故障排除过程中提供比我看到的无意义的Excel错误更好的洞察力:
使用AppleScript编辑器确认脚本实际上可以像任何用户一样工作,也可以使用任何环境变量:
将新的简单脚本输入新文件,而不用加倍双引号 - 我的读取
do shell script "parseCsvAndOpen.sh"
现在将您的简单脚本从AppleScript编辑器复制到您的vba并确认它仍然有效
我能够将我的双引号加倍并在MacScript代码后用双引号括起来:
MacScript "do shell script ""parseCsvAndOpen.sh"""
这确实是一个,两个,然后三个双引号字符! (大概是逃避双引号)
答案 4 :(得分:1)
起初,Joel的优秀教程对我不起作用(在OS X 10.11.6和Excel for Mac 2011上)。经过一番调查后,我发现我的问题是由扩展属性"在我的脚本文件test.sh中。在终端中,ls -l test.sh
产生:
-rwxr-xr-x@ 1 tgk staff 456 Mar 16 13:12 test.sh
请注意" @"表示存在扩展文件属性。通过调用ls -l@ test.sh
来提供更多信息,其产生:
-rwxr-xr-x@ 1 tgk staff 456 Mar 16 13:12 test.sh
com.apple.FinderInfo 32
com.apple.TextEncoding 15
换句话说,根据文件的创建方式,它可能有也可能没有扩展属性。所以我通过xattr -c test.sh
剥离了扩展属性,然后是Joel的调用:Shell ActiveWorkbook.Path & ":test.sh"
完美无缺!非常感谢大家。
____
我后来了解到,通过首先在Terminal中调用defaults write com.barebones.textwrangler WriteExtendedAttributes never
,可以在TextWrangler中保存shell脚本而无需编写扩展属性。但是,这只会阻止添加com.apple.FinderInfo
属性; com.apple.TextEncoding
属性仍然存在。但幸运的是,当shell脚本只有com.apple.TextEncoding
扩展属性时,Joel的VBA脚本命令现在可以正常工作!所以,TextWrangler是我的编辑器!
答案 5 :(得分:0)
我没有安装MS Office for Mac,所以我无法测试我建议的答案。我想应该可以调用Bash二进制文件(即/ bin / bash)并传递要作为参数执行的脚本的名称。这将避免使用权限位的任何问题,并确保第二个参数的路径名是通常的Unix样式/分隔的路径名。对于第一个参数,通过名称调用bash可能就足够了,没有任何路径,因为它应该使用PATH环境变量。
总而言之,仍然没有经过测试,我试试这个:
Shell("bash runmybatch.sh")
或者,如果由于工作目录不正确而无效,
Shell("bash '" & location & "/runmybatch.sh'")
其中location是工作簿目录的/ -separated路径。 sngle引号应该照顾路径中的任何空格或其他异域字符。
答案 6 :(得分:0)
您需要做的是在VBA宏中编写以下命令:
Shell "C:Path\to\script\location\script.sh"
(请记住在路径周围加上双引号)
获取脚本位置的最佳方法是录制宏以将工作簿保存在bash脚本所在的同一文件夹中。这样,您可以稍后查看Excel如何调用该路径并将其复制/粘贴到上面的shell命令中。