Как контролировать содержимое папки без блокировки Finder - PullRequest
1 голос
/ 29 сентября 2019

Как вы можете видеть из моего кода ниже, я чрезвычайно новичок в этом. Мой код почти работает, но моя главная проблема в том, что он запускает Finder, и иногда он не устанавливает изображение рабочего стола, но делает большую часть времени!

Сценарий просто контролирует папку, и если "***. jpg ", затем к нему добавляется изображение рабочего стола.

Это мой самый первый сценарий, поэтому мне нужно многому научиться,

set reset to ""
display notification "Alarm Front Active  " & (current date) as string
tell application "Finder"
    set path_to_sourceFull to ":photo:FRONT CAM 1:20190929:images" -- from nsa310 network drive
    set path_to_source to ":photo:FRONT CAM 1:20190929:images" -- from nsa310 network drive
    set directory1 to "/Volumes/photo/FRONT CAM 1/20190929/images" as text -- from nsa310 network drive 
    set path_to_destinationFull to "Macintosh HD:Users:rekordbox:Documents:temp folder 2"
    set path_to_destination to ":Users:rekordbox:Documents:temp folder 2"
    set directory2 to "/Users/rekordbox/Documents/temp folder 2" as text

    repeat while reset = ""
        set allok to ""
        set filelist to name of every item in folder path_to_source --of startup disk       
        set listSizesaved to count of filelist
        delay 1

        repeat while allok = ""
            set filelist to name of every item in folder path_to_source --of startup disk           
            set listSize to count of filelist
            if listSize = listSizesaved then
            else
                set filelist to name of every item in folder path_to_source --of startup disk
                set listSize to count of filelist
                set LastAddedFile to item listSize of filelist
                set allok to "ALARM"
                set listSizesaved to listSize -- (save the updated) count               
                set activefile to (path_to_source & LastAddedFile)
                set selectedpicture to (directory1 & "/" & LastAddedFile)
                tell application "System Events" to tell every desktop to set picture to selectedpicture
                delay 1
                display notification "ALARM FRONT TRIGGERED...." & (current date) as string
                delay 1
            end if
        end repeat
    end repeat

end tell

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Сценарий, который вам нужен, я думаю, таков:

on adding folder items to thisFolder after receiving filelist
    set droppedFile to first item of filelist

    tell application "System Events"
        tell every desktop
            set picture to droppedFile
        end tell
    end tell
end adding folder items to

(я пропустил бит 'Alarm', так как не был уверен, какой в ​​этом смысл).

Чтобы использовать этот сценарий, скопируйте его в редактор сценариев, сохраните его в папке ~/Library/Scripts/Folder Action Scripts/, затем откройте апплет «Настройка действий папки». Добавьте нужную папку слева и выберите файл, который вы только что сохранили справа. Это должно выглядеть примерно так: enter image description here ... где галочка слева показывает, что действия с папкой включены для папки (которую я назвал «тестовой папкой») и сценария (который я назвал'FADtop.scpt') прилагается.

Перетащите изображение в папку, и оно должно просто работать.

Как правило, не пишите в Finder, если вам абсолютно не нужно;всегда используйте системные события. Finder - загруженное приложение, и его скрипты могут привести к сбоям в работе системы. А также попытайтесь избежать этого шаблона проектирования:

(* Don't do this! *)
repeat 
    (* test for something *)
    delay x
end

Команда delay не особенно ресурсоэффективна. Если вы действительно хотите использовать систему опроса для тестирования какого-либо события, часто лучше создать отдельное приложение с обработчиком on idle. Таким образом, вы дадите системе разбудить и перевести сценарий в режим ожидания со значительным улучшением производительности.

РЕДАКТИРОВАТЬ

Поскольку действия с папками, по-видимому, не работают при сбросе ftp наудаленные диски, вот достаточно эффективный подход для опроса папок. Сохраните следующий сценарий как приложение, которое остается открытым (выберите «Приложение» в качестве типа файла и установите флажок «оставаться открытым»). Затем запустите приложение и оставьте его работать в фоновом режиме.

property dateOfLastFileChosen : missing value
property targetFolder : "/Volumes/photo/FRONT CAM 1/20190929/images"
property idleTime : 300 -- 300 seconds is five minutes

on run
end run

on idle
    tell application "System Events"
        if exists folder targetFolder then
            if dateOfLastFileChosen is missing value then
                set recentFiles to every file of folder targetFolder whose visible is true
            else
                set recentFiles to every file of folder targetFolder whose modification date > dateOfLastFileChosen and visible is true
            end if

            set newFile to my mostRecentFileOfList(recentFiles)
            if newFile is not missing value then
                set dateOfLastFileChosen to modification date of newFile
                tell every desktop
                    set picture to (POSIX path of newFile)
                end tell
            end if
        end if
    end tell

    return idleTime -- check every 5 minutes (300 seconds)
end idle

on mostRecentFileOfList(fileList)
    set maxDateObj to missing value
    repeat with thisFile in fileList
        if maxDateObj is missing value then
            set maxDateObj to contents of thisFile
        else if modification date of thisFile is greater than modification date of maxDateObj then
            set maxDateObj to thisFile
        end if
    end repeat
    return maxDateObj
end mostRecentFileOfList
0 голосов
/ 06 октября 2019

Не пытаясь украсть гром у @Ted Wrigley, чье решение предоставило код AppleScript для действия с папкой, я чувствовал, что у меня было достаточно комментариев и элементов, чтобы добавить его, чтобы опубликовать его в качестве другого ответа на дилемму ОП.

Сначала я рассмотрю строки кода tell every desktop set picture to droppedFile в следующем действии папки AppleScript. Если у пользователя есть только один монитор / дисплей, подключенный к компьютеру, но он создал несколько разных «пробелов», строки кода tell every desktop set picture to droppedFile изменят только изображение рабочего стола для рабочего стола только из текущего активного «пробела»,Другие фоны рабочего стола не будут изменены. Однако, если у пользователя есть несколько мониторов / дисплеев, подключенных к компьютеру, строки кода tell every desktop set picture to droppedFile изменит рисунки рабочего стола для рабочих столов текущего активного «пространства» для каждого подключенного монитора / дисплея. Если последнее не является желаемым результатом, то tell every desktop следует изменить на tell current desktop.

После тестирования кода действия папки AppleScript, предоставленного @Ted Wrigley, я заметил, что файл изображения загружается с FTPсервер, к тестовой папке, к которой я прикрепил скрипт действия папки, выглядел так до того, как изображение было фактически закончено. Поскольку файл был как бы там, а не там, он не вызвал действие папки.

enter image description here

Затем я решил добавить задержку кбыть началом кода действия папки, чтобы разрешить передачу файла изображения с FTP-сервера, чтобы завершить. Я добавил задержку в 180 секунд, чтобы завершить передачу, и она заработала. Когда передача была завершена, файл выглядит следующим образом.

enter image description here

В зависимости от того, сколько файлов вы ожидаете передать в любой момент времени с учетом фактора вдля размеров файлов ... Возможно, вам может понадобиться значительно увеличить время задержки.

on adding folder items to thisFolder after receiving theseFiles
    delay 180
    set newBackground to first item of theseFiles

    tell application "System Events"
        set picture of current desktop to newBackground -- Single Display Attached
        --set picture of every desktop to newBackground -- Multiple Displays Attached
    end tell
end adding folder items to
...