AppleScript: как скопировать реальный файл вместо псевдонима, но рекурсивно - PullRequest
0 голосов
/ 27 марта 2019

Я использую следующий скрипт для копирования содержимого определенной папки с моего жесткого диска на USB-флешку.Поскольку содержимое папки может измениться, я использую псевдонимы.

Раньше сценарий работал идеально, но, поскольку мне приходилось вносить изменения в структуру папок, у меня теперь иногда есть псевдоним псевдонима (обход сценария, не буду вдаваться в подробности).

Проблема в том, что скрипт, по-видимому, конвертирует только первый уровень псевдонимов-папок, но если в псевдониме для папки есть псевдоним для файла, он копирует псевдоним файла.

Интересно, можно ли сказать сценарию рекурсивно пройти каждый уровень папки (т.е. каждый файл) и скопировать вместо него оригинальный файл?

Спасибо!

Питер

ps: примерная структура папок исходной папки:

псевдоним папки 1

          alias of folder 1-1

                   alias of file a, alias of file b

псевдоним папки 2

         alias of file c

--> first a dialogue

display notification "hello, get folder ready"
delay 5 --> allow time for the notification to trigger

set theDialogText to "choose source"
display dialog theDialogText



--> Result: {button returned:"OK"}


--> now computing

set the backupSource to (choose folder) as alias

set theDialogText to "choose destination"


display dialog theDialogText

--> Result: {button returned:"OK"}


set the backupDestination to (choose folder) as alias

display notification "maybe this takes a while..."

delay 6 --> allow time for the notification to trigger

--> now copy

tell application "Finder"

    activate
    with timeout of 600 seconds --> equeals 10 Minutes

        set everyAlias to every item of folder backupSource
        repeat with thisAlias in everyAlias

            set originalFile to (original item of thisAlias)
            duplicate originalFile to backupDestination

        end repeat
    end timeout
end tell
``````````

I feel that the the line "repeat thisAlias in everyAlias" doesn´t do its job and goes only one level down, ie it converts the alias on the first level and not all other aliases within this alias-folder

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Может быть, следующий код AppleScript поможет вам достичь того, что вы ищете?

tell application "Finder"
    set sourceFolder to choose folder with prompt "CHOOSE SOURCE"
    set destinationFolder to choose folder with prompt "CHOOSE DESTINATION"
    set nestedFolders to a reference to (entire contents of sourceFolder)
    set aliasFiles to a reference to every alias file of nestedFolders
    set aliasFiles to contents of aliasFiles
    repeat with i from 1 to count of aliasFiles
        set thisItem to item i of aliasFiles
        if not (exists of original item of thisItem) then
            delete thisItem
        end if
    end repeat
    set aliasFiles to a reference to every alias file of nestedFolders
    set originalFiles to (original item of aliasFiles) as alias list
    duplicate originalFiles to destinationFolder
end tell
0 голосов
/ 27 марта 2019

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

Например, в начале,
set debugOn to true
или лучше
property debugOn : true

Затем прямо перед вашей командой duplicate,

if debugOn then display dialog ¬
     "Copying thisAlias: " & return & (thisAlias as text) & return & ¬
     "of originalFile: " & return & originalFile buttons "OK" default button 1

… и так далее.Вы можете оставить эти проверки if debugOn then… во всем коде с помощью диалоговых окон или даже других режимов поведения и просто изменить его на property debugOn : false, как только он заработает.Наличие всего этого также отлично подходит для неизбежного дня, когда вам нужно отредактировать сценарий, но он достаточно выдержан, вы забыли все его нюансы.

...