在上一个问题中,我询问了如何为蓝牙文件交换创建Applescript。我现在想(如果可能的话)检查当前是否有正在进行的交换,如果有,请等待它在另一个文件通过之前完成,创建某种类型的队列。
使用我当前的代码,如果您在传输过程中尝试通过另一个文件进行传输,则会产生错误,从而破坏整个自动化过程。
我当前的自动化设置如下。我有另一个自动化程序,可以检测文件何时添加到我的相机的SD卡中,然后将其重命名为“HP.jpg”并将其传输到ImagesPrint文件夹(下方),激活此项:
移动后,会使用时间重命名,因此没有重复项。
我计划同时将多个图像(15-20)放入相机sd文件夹中并将此“排队”以某种方式“减慢”,这样一次只有一个可以完成整个过程,所以文件传输没有填满。
答案 0 :(得分:3)
我相信我有办法确定蓝牙文件传输是否正在进行,或者更有用的是 - 当蓝牙文件传输完成或终止时。
我的答案的第一部分是一个题外话,很大程度上是因为我无法通过蓝牙文件交换的send
命令在我的系统上使用AppleScript来启动文件传输申请。我不知道为什么,我没有耐心去诊断它。因此,我使用AppleScript GUI脚本直接与蓝牙文件交换应用程序GUI进行交互,并物理控制文件发送过程。
(当然,这确实意味着我必须从弹出的对话框中手动选择文件,这对我的需求很好。)
我会在此处提供我的脚本作为其他任何可能感兴趣的人的参考,即使它与您的问题无关。我不能特别推荐这种方法,因为它不是很强大,AppleScript在一次运行中偶尔会抛出一个错误,但在接下来的5或6次运行中它将完全正常运行,所以它和#39;有点不稳定。我在MacOS 10.13上运行它:
activate application "Bluetooth File Exchange"
tell application "System Events" to tell application process "Bluetooth File Exchange"
tell menu item "Send File…" of menu "File" of menu bar item "File" of menu bar 1 to ¬
perform action "AXPress"
repeat while (exists window "Select File to Send")
end repeat
set W to a reference to (first window whose name begins with "Send")
tell W
set SendButton to button "Send"
set R to a reference to rows of table 1 of scroll area 1
set T to a reference to (static texts of UI element 1 of R whose value is Device)
set U to a reference to value of attribute "AXParent" of T
set [D] to a reference to value of attribute "AXParent" of U
select D
set start_time to do shell script "date +%Y-%m-%d\\ %H:%M:%S"
click SendButton
end tell
(*
repeat while (exists W)
end repeat
(*** File transfer started ***)
set W to a reference to window "Bluetooth File Exchange"
repeat until (exists W)
end repeat
repeat while (exists W)
delay 2
end repeat
(*** File transfer finished ***)
*)
end tell
当以这种方式与应用程序进行物理交互时,文件传输期间会出现进度窗口。纯粹作为一个练习,我把这个窗口的监控结合起来,以便在文件传输开始时进行标记;然后再次消失,以便在文件传输完成时进行标记。它工作得很好,但显然不是你的特定情况的解决方案,所以这些行在上面的代码中被块注释。
经过我的计算机上的各种日志文件的大量梳理后,我设法隔离了两个在蓝牙文件传输过程中写入的有用日志条目。由于此类文件传输将由系统记录,因此它提供了一种确定何时开始(或已开始)蓝牙文件传输以及何时完成(或完成)的可靠方法。
可以使用shell命令log
访问日志数据,并使用指定的参数进行过滤。请注意,我选择的参数不是唯一可用的参数,也不是唯一可用于确定蓝牙文件传输的开始/停止的参数。在日志的不同部分,我注意到有报告的并行事件消息与我最终确定的事件一样可靠。我选择了我的特定subsystem
和category
,因为这些数据中包含的消息是人类可读的英语,并且对于正在发生的事件有明确的明确性。
我创建了相关的shell命令并将其存储在AppleScript变量中:
set command to "log show --predicate " & ¬
"'(subsystem == \"com.apple.bluetooth\") && (category == \"bluetoothd\")'" & ¬
" --start \"" & start_time & "\" --style json " & ¬
"| grep 'EVENT: Disconnection Complete'"
然后,就在文件传输被激活之前(即在我的脚本点击Send
按钮之前),我获得了传输的开始日期和时间(正如您在上面的脚本中看到的那样:{{ 1}}),然后持续监视日志,以查看报告完成蓝牙传输的时间戳之后出现的相应消息:
set start_time to do shell script ...
写入日志的消息非常清晰 repeat
try
set disconnected to do shell script command
if disconnected contains "EVENT: Disconnection Complete" then ¬
exit repeat
end try
delay 2
end repeat
,在其日志条目的完整上下文中读取时,报告蓝牙设备断开以响应文件传输的终止(或者通过成功或失败)。我在EVENT: Disconnection Complete
中使用grep
命令来过滤日志条目并仅隔离该部分文本。
因此,在上面的do shell script
循环中,repeat
大部分时间都会花费错误(非常正确),因为缺少此文字意味着do shell script
无法返回一个值。当日志条目最终出现时,grep
找到它并返回它,这允许grep
循环结束。
同样,当蓝牙文件传输开始时,会有一条事件消息写入日志,报告repeat
,另一条报告OBEX Object Push
。这些是用于开始蓝牙传输的非常明确的标记,但是我没有理由专门监视这些日志条目的出现,因为脚本控制着确定文件传输何时开始。
将后两个AppleScript片段添加到运行AppleScript 操作中可以让您摆脱暂停操作,因为AppleScript会继续运行其OBEX File Transfer
循环,直到文件传输完成。
首先,在repeat
声明之前粘贴此行:
tell application "Bluetooth File Exchange" to send...
接下来,在 set start_time to do shell script "date +%Y-%m-%d\\ %H:%M:%S"
语句之后粘贴其余的日志监控代码。因此,运行AppleScript 操作现在将如下所示:
tell application...
如果您对日志条目的整体状况感到好奇(但仍然按子系统和类别进行过滤),则可以检查JSON格式的输出here,在此期间有两个单独的蓝牙文件转移开始并完成。