Capture One 21 的 AppleScript Automation:用于监视文件夹的脚本出现问题

问题描述 投票:0回答:1

我希望有人可以帮助我解决我一直在为照片软件“Capture One 21”处理的自动化问题。我需要监视一个文件夹(桌面上的捕获文件夹),并且每当有新文件时添加到其中后,程序(Capture One)应触发 Command+D 键盘快捷键,将 RAW 文件导出为 JPG 文件。导出后,JPG 文件以其他文件夹结尾。

不幸的是,我没有编程背景,所以我花了很多时间试图在 ChatGPT 的帮助下创建一个脚本,但现在我只是在原地打转。

所以,我基本上想要实现的目标:

  • 每次桌面上名为“Hochzeit Teather Ordner”的绑定捕获文件夹中出现新图像时,我希望 Capture One 自动执行“Command+D”键盘快捷键。

到目前为止我所做的:

  1. 自动化工作流程:

    • 我已经设置了一个 Automator 工作流程来监控“Hochzeit Teather Ordner”。
    • 工作流程包括一个 shell 脚本,用于检查文件夹中的新文件。
    • 当检测到更改时,AppleScript 应该将“Command+D”键盘快捷键发送到 Capture One。
  2. Automator 中的 Shell 脚本:

    • shell 脚本在文件夹中保存文件列表并定期检查更新。
    • 如果检测到新文件,则会触发 AppleScript 模拟键盘快捷键。
  3. 用于发送击键的AppleScript:

    • AppleScript 旨在每当检测到新图像时将“Command+D”快捷方式发送到 Capture One。
    • 不幸的是,我不断遇到语法错误:“预期结束,但发现。”
    • 尽管多次尝试排除故障,但此问题仍然存在,并且我似乎无法使脚本正常工作。

遇到的问题:

  • 语法错误:在 AppleScript 中反复遇到“预期结束,但发现”错误。
  • 自动化权限:确保 Automator 和系统事件具有发送击键所需的权限,但仍然遇到问题。
  • 脚本执行:尽管进行了多次修订,AppleScript 仍无法按预期执行。

我需要帮助:

  • 修复 AppleScript 语法错误并确保其与 Automator 工作流程无缝协作。
  • 在 Capture One 21 中实现所需自动化的任何建议或替代方法。
  • 澄清可能影响工作流程的任何特定权限或设置。

当前 shell 脚本:

#!/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

当前AppleScript:

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

任何指导或建议将不胜感激。

macos shell automation applescript automator
1个回答
0
投票

发生 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
中击键的菜单项。如果是,请使用它,因为它不需要将目标应用程序放在前面。

© www.soinside.com 2019 - 2024. All rights reserved.