我希望有人可以帮助我解决我一直在为照片软件“Capture One 21”处理的自动化问题。我需要监视一个文件夹(桌面上的捕获文件夹),并且每当有新文件时添加到其中后,程序(Capture One)应触发 Command+D 键盘快捷键,将 RAW 文件导出为 JPG 文件。导出后,JPG 文件以其他文件夹结尾。
不幸的是,我没有编程背景,所以我花了很多时间试图在 ChatGPT 的帮助下创建一个脚本,但现在我只是在原地打转。
所以,我基本上想要实现的目标:
到目前为止我所做的:
自动化工作流程:
Automator 中的 Shell 脚本:
用于发送击键的AppleScript:
遇到的问题:
我需要帮助:
#!/bin/bash
captureFolder="$1"tempFile="/tmp/current_files.txt"
ls "$captureFolder" > "$tempFile"
while true; dosleep 10 currentFiles=$(ls "$captureFolder")if ! diff <(echo "$currentFiles") "$tempFile" > /dev/null; thenosascript -e 'tell application "System Events" to keystroke "d" using {command down}'ls "$captureFolder" > "$tempFile"fidone
on run {input, parameters} -- Pfad zum Capture One-Ordner
set captureFolderPath to POSIX path of (item 1 of input)
-- Helper function to retrieve the file names in the folder
-- on listFilesInFolder(folderPath)
-- set fileList to do shell script "ls " & quoted form of folderPath
-- return fileList
-- end listFilesInFolder
-- Save initial file list
set currentFiles to listFilesInFolder(captureFolderPath)
-- New file monitoring loop
repeat
delay 10 -- Warte 10 Sekunden
-- Get new file list
set newFiles to listFilesInFolder(captureFolderPath)
-- Check if the file list has changed
if currentFiles ≠ newFiles then
-- Wenn sich die Dateiliste geändert hat, sende Tastenkombination an Capture One
tell application "System Events"
tell process "Capture One 21" -- Ersetze "Capture One 21" durch die Version, die du verwendest
if exists window 1 then
keystroke "d" using {command down}
end if
end tell
end tell
-- Update the list of current files
set currentFiles to newFiles
end if
end repeat
return input
end run
任何指导或建议将不胜感激。
发生 AppleScript 错误是因为任何处理程序 (
on …
) 必须位于脚本的顶层。
还有另一个大问题。击键始终发送到最前面的应用程序,因此您必须在发送击键之前激活
Capture One
。
on run {input, parameters} -- Pfad zum Capture One-Ordner
set captureFolderPath to POSIX path of (item 1 of input)
-- Save initial file list
set currentFiles to listFilesInFolder(captureFolderPath)
-- New file monitoring loop
repeat
delay 10 -- Warte 10 Sekunden
-- Get new file list
set newFiles to listFilesInFolder(captureFolderPath)
-- Check if the file list has changed
if currentFiles ≠ newFiles then
-- Wenn sich die Dateiliste geändert hat, sende Tastenkombination an Capture One
activate application "Capture One 21" -- ⚠️ this line is mandatory
tell application "System Events"
tell process "Capture One 21" -- Ersetze "Capture One 21" durch die Version, die du verwendest
if exists window 1 then
keystroke "d" using {command down}
end if
end tell
end tell
-- Update the list of current files
set currentFiles to newFiles
end if
end repeat
return input
end run
-- Helper function to retrieve the file names in the folder
on listFilesInFolder(folderPath)
set fileList to do shell script "ls " & quoted form of folderPath
return fileList
end listFilesInFolder
然而,定期检查文件夹中的文件更改是非常昂贵的,也是一种不好的做法。
AppleScript 提供了
Folder Actions
,它可以监视对 AppleEvents 做出反应的文件夹。将此脚本放入〜/ Library / Scripts(〜是主文件夹)并通过右键单击文件夹>服务>文件夹操作设置在Finder中设置文件夹操作...
on adding folder items to this_folder after receiving added_items
activate application "Capture One 21"
tell application "System Events"
tell process "Capture One 21"
if exists window 1 then
keystroke "d" using {command down}
end if
end tell
end tell
end adding folder items to
关于权限,您必须在系统设置 > 隐私和安全 > 辅助功能中向脚本编辑器授予辅助功能权限。
最后一点:是触发
Capture One
中击键的菜单项。如果是,请使用它,因为它不需要将目标应用程序放在前面。