如何bash
在 MAC OSX 上使用 VBA 运行文件
我尝试了以下代码
location = FolderPath(ThisWorkBook.FullName)
它返回当前目录减去文件名。
其次是
Shell(location &"runmybatch.sh")
我这样做是因为 bash 脚本与 excel 电子表格位于同一文件夹中。
有几个惊喜让这件事变得棘手!
除此之外,您应该能够使用Shell命令运行 bash 脚本。以下是帮助您入门的分步说明。
#!/bin/bash open /Applications/Calculator.app/
Shell ActiveWorkbook.Path & ":test.sh"
我对 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"
这将返回带有:
's 的路径,我认为必须将其转换为/
's do shell script
。这可以通过 AppleScriptquoted form of POSIX path of FilePathName_s
或 VBA来完成FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")
即使我将它放在全局路径 (/usr/bin) 上并且所有用户都具有读取和执行权限,我也无法让我的简单 bash 脚本正常工作。有两件事导致我的脚本失败:由于 AppleScript 环境和我的用户的 bash 环境之间的差异导致的权限和路径。我发现Office 2011 for Mac中 VBA Shell 函数的讨论对解决我的问题更有帮助。这是我最终确定的过程。
因为 Excel 掩盖了底层细节,我建议使用 AppleScript 编辑器,它希望在您的故障排除过程中比我看到的无意义的 Excel 错误提供更好的洞察力:
使用 AppleScript 编辑器来确认脚本实际上可以作为任何用户使用,并且使用了任何环境变量:
在不加双引号的情况下将您的简单脚本输入新文件- 我的读取
do shell script "parseCsvAndOpen.sh"
现在将您的简单脚本从 AppleScript 编辑器复制到您的 vba 并确认它仍然有效
我能够将我的双引号加倍并将其放在 MacScript 代码之后的双引号中:
MacScript "do shell script ""parseCsvAndOpen.sh"""
那确实是一个,两个,然后是三个双引号字符!(大概是转义双引号)
我没有使用 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)
无论如何,希望它有点帮助。我将继续寻找更好的方法,需要一些东西来动态地找到可靠的文件位置。
起初,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"
完美运行!非常感谢大家。
____
后来我了解到,通过首先defaults write com.barebones.textwrangler WriteExtendedAttributes never
在终端中调用,可以在 TextWrangler 中保存 shell 脚本而不编写扩展属性。但是,这只会阻止添加com.apple.FinderInfo
属性;该com.apple.TextEncoding
属性仍然存在。然而幸运的是,当 shell 脚本只有com.apple.TextEncoding
扩展属性时,Joel 的 VBA 脚本命令现在可以工作了!所以,TextWrangler 是我的编辑器!
我没有安装 MS Office for Mac,所以我无法测试我提出的答案。我想应该可以调用 Bash 二进制文件(即 /bin/bash)并将您想要执行的脚本的名称作为参数传递。这将避免权限位的任何问题,并确保第二个参数的路径名是通常的 Unix 风格的 / 分隔的。对于第一个参数,按名称调用 bash 可能就足够了,没有任何路径,因为它应该使用 PATH 环境变量。
总而言之,仍然没有测试,我会试试这个:
Shell("bash runmybatch.sh")
或者,如果由于工作目录不正确而无法正常工作,
Shell("bash '" & location & "/runmybatch.sh'")
其中 location 是工作簿目录的 / 分隔路径。单引号应注意路径中的任何空格或其他外来字符。
您需要做的是在您的 VBA 宏中编写以下命令:
Shell "C:Path\to\script\location\script.sh"
(记得在路径两边加上双引号)
获取脚本位置的最佳方法是录制一个宏以将工作簿保存在 bash 脚本所在的同一文件夹中。这样,您以后可以查看 Excel 如何调用该路径并将其复制/粘贴到上面的 shell 命令中。