我正在尝试找到一种在我的 NAS 上自动安装共享 (afp) 的方法。我使用登录来控制计算机可以访问哪些共享(出于隐私和其他原因)。切换登录时,并非所有共享都会重新安装,这会导致我运行的某些应用程序出现问题。
我想要做的是有一个脚本,每次我登录到 NAS 时都会运行(即使它只是访客登录),然后这个脚本会挂载共享。
我想知道是否有人能指出我正确的方向。这是在 OS X 计算机上,所以正在考虑使用 applescript 来实现这一点。
提前致谢
汤姆
我正在尝试找到一种在我的 NAS 上自动安装共享 (afp) 的方法。我使用登录来控制计算机可以访问哪些共享(出于隐私和其他原因)。切换登录时,并非所有共享都会重新安装,这会导致我运行的某些应用程序出现问题。
我想要做的是有一个脚本,每次我登录到 NAS 时都会运行(即使它只是访客登录),然后这个脚本会挂载共享。
我想知道是否有人能指出我正确的方向。这是在 OS X 计算机上,所以正在考虑使用 applescript 来实现这一点。
提前致谢
汤姆
我多年来一直在我的 Mac 上解决这个问题,并相信我终于找到了解决方案。
我把它分成两个脚本:
第一个(在 applescript 编辑器中作为保持打开的应用程序导出)在空闲时运行(而不是重复循环),并每 10 秒调用第二个脚本来处理驱动器安装。我在第一个脚本中检查的错误非常重要,因为 -128 确保您仍然可以通过右键单击或在 osx 关闭时退出保持打开脚本,而 -5014 是一个未知错误,除非明确处理会弹出一个对话框我的情况。
--------------------------------------------------------------------------------------
--"On Idle Launch Basic Drive Mounter.app"
on idle
try
--script loads on startup, so first we wait 5 seconds to ensure network
delay 5
--run the mounter script which is on the desktop
run script file ":Users:localusername:Desktop:Basic Drive Mounter.app"
on error errStr number errorNumber
--listen for the apple quit command and quit
if the errorNumber is equal to -128 then
quit
return 1
--listen for the unknown error and ignore it
else if the errorNumber is equal to -5014 then
return 5
else
--all other errors are also ignored
return 5
end if
end try
--return with a wait of 5 seconds before next idle run
return 5
end idle
--------------------------------------------------------------------------------------
第二个脚本(作为应用程序导出)检查网络,然后尝试使用 shell 挂载来挂载卷。我最初使用查找器“安装卷”并且该代码作为内联注释存在,但我不喜欢弹出错误对话框;即使只有一秒钟,所以我继续使用 shell 脚本。
--------------------------------------------------------------------------------------
--"Basic Drive Mounter.app"
try
set IP_address to "xxx.xxx.xxx.xxx"
set IP_Valid to true
try
do shell script ("ping -c 2 " & IP_address)
on error
set IP_Valid to false
end try
if IP_Valid then
tell application "Finder"
if disk "work" exists then
else
try
do shell script "mkdir /Volumes/work"
end try
do shell script "mount_afp afp://xxx.xxx.xxx.xxx/work /Volumes/work/"
-->>finder mount volume version
--with timeout of 1 second
-- mount volume "afp://xxx.xxx.xxx.xxx/work"
--end timeout
--<<finder mount volume version
end if
end tell
end if
on error
return 0
-->>finder mount volume version
--on error finder returns an error dialog which needs to be closed to go back and retry
--tell application "System Events"
-- keystroke return
--end tell
--<<finder mount volume version
end try
--------------------------------------------------------------------------------------
一旦你让它工作,将第一个脚本/应用程序拖到你的用户登录项中,让它在你登录时自动启动。如果你不需要持久重新映射,然后将第二个脚本/应用程序拖到登录项中一次运行。
基本思想是创建一个启动代理来监视文件夹的更改。您将需要查看 /Volumes 文件夹,因为当您登录 NAS 时,会在 Volumes 文件夹中挂载一些东西。因此,监视代理将检测到 Volumes 文件夹中的某些内容发生了变化,并将运行一个脚本。
这很简单。你可以google一下launchd并找到很多例子。但是要设置一个监视文件夹,请使用类似这样的东西......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>WatchPaths</key>
<array>
<string>/Volumes</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/path/to/applescript</string>
</array>
<key>Label</key>
<string>com.someName.plistFileName</string>
</dict>
</plist>
所以只需用上面的代码创建一个文本文件。使用扩展名“.plist”保存它。在 ProgramArguments 部分中插入 applescript 的路径,并在 Label 部分中为其命名。
将此 plist 放入 ~/Library/LaunchAgents 文件夹并重新启动计算机。现在,每次 /Volumes 文件夹中的某些内容发生变化时,都会运行 applescript。
然后,您只需正确创建 applescript。您首先需要检查 Volumes 文件夹并查看您的 NAS 是否已安装。如果是,则安装您想要的任何其他共享,如果不是,则不执行任何操作。您可以谷歌(或搜索堆栈溢出)如何使用 applescript 挂载共享。
祝你好运。