Como combinar o comando “Escolher pasta” com a função “adicionar itens de pasta” com o Applescript

2

Eu estou usando uma ação de pasta para criar uma pasta "hot", que imediatamente duplica os arquivos colocados nesta pasta para uma pasta de backup específica.

Este é o script que estou usando como ação de pasta e funciona bem:

on adding folder items to this_folder after receiving these_items
   tell application "Finder" to duplicate these_items to folder 
   ("Macintosh HD:Users:photograper:Desktop:Target:")
end adding folder items to

Mas eu quero executar essa ação de pasta como um applescript normal e acionar a função "adicionar itens de pasta" com um comando "Escolher pasta". Assim, posso apontar manualmente uma pasta de origem e destino específica e obter o script em execução.

Eu tentei isso, mas nenhum resultado:

set this_folder to choose folder with prompt "Select source folder:" 
with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"


on adding folder items to this_folder after receiving these_items
   tell application "Finder" to duplicate these_items to target_folder
end adding folder items to

Alguma sugestão de como combinar as duas partes do script para que elas possam interagir?

Obrigado!

Patrick

Pat78
fonte

Respostas:

1

Apenas remova o manipulador e altere a variável "these_items" para "this_folder", da seguinte forma:

set this_folder to choose folder with prompt "Select source folder:" with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"

tell application "Finder" to duplicate this_folder to target_folder

Em seguida, execute o script como um script normal e ele copiará a pasta inteiramente para o seu destino.

Se, por outro lado, você quiser apenas que os itens sejam copiados (não a pasta), você pode usar essa variação:

set this_folder to choose folder with prompt "Select source folder:" with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"

tell application "Finder"
    set these_items to list folder of this_folder without invisibles
    repeat with i from 1 to count of these_items
        set ItemX to item i of these_items
        set ItemX to (this_folder & ItemX as string) as alias
        duplicate ItemX to target_folder
    end repeat
end tell

De qualquer forma, você acabaria com uma cópia do conteúdo da pasta.

Agora, dados seus comentários abaixo, esta versão executará o script como uma ação de pasta, mas lembrará sua pasta de destino quando você declarar uma propriedade no início do script. Se você recompilar o script, ele perguntará novamente.

property target_folder : ""

on adding folder items to this_folder after receiving these_items
    if target_folder = "" then
        set target_folder to ¬
            choose folder with prompt "Select source folder:" with multiple selections allowed
    else
        try
            --if the script has a property that has been deleted (i.e., the destination folder), it will cause 
            --an error that resolves by asking for a new folder
            set target_folder to target_folder as alias
        on error
            set target_folder to ¬
                ¬
                    choose folder with prompt "Select source folder:" with multiple selections allowed
        end try
    end if
    tell application "Finder" to duplicate these_items to folder target_folder
end adding folder items to

Eu espero que isso ajude.

MBUST
fonte
Obrigado pela sua resposta, eu não quero usar a ação de pasta com as instruções "adicionar itens de pasta". Quando um arquivo é solto na pasta eu não quero duplicar para uma pasta de destino imidiatamente, é isso que eu quero. Eu tentei colocar o comando "Escolher pasta" para definir o destino. pasta dentro das 2 declarações, mas toda vez que um arquivo é descartado, ele acionará a "janela de escolha". Existe uma maneira de definir a pasta de destino uma vez? que é usado por todos os arquivos soltos na pasta de origem? Obrigado!
Pat78
isto é o que eu tentei: adicionar itens de pasta para this_folder depois de receber these_items definir target_folder para escolher a pasta com o prompt "Selecionar pasta de backup:" dizer aplicativo "Finder" para duplicar these_items para target_folder final adicionando itens de pasta para
Pat78
Desculpe, eu entendi mal quando você disse que queria correr "como um applescript normal". Portanto, se você quiser que a janela de pasta de opções apareça apenas uma vez e, a partir de então, use a mesma pasta, declare uma propriedade no início do script. Veja o email editado acima.
MBUST
Sim! Isso é exatamente o que eu quis dizer e funciona. Eu tentei o "if - then" declaração antes, mas não sabia sobre a propriedade no início. Muito obrigado!
Pat78
Existe uma maneira que eu possa definir a pasta de destino toda vez que usar o script em outra pasta ou quando eu excluir a pasta de destino? Sem recompilar o script? Agora, como você disse, está se lembrando da pasta de destino, mesmo quando eu deletei a pasta de destino. Obrigado!
Pat78
0

@Patrick de Gier, esta versão alterada do código @MBUST, permite ao usuário escolher uma pasta de destino toda vez

on adding folder items to this_folder after receiving these_items
    set target_folder to choose folder with prompt "SELECT TARGET FOLDER:" with multiple selections allowed
    tell application "Finder" to duplicate these_items to folder target_folder
end adding folder items to
wch1zpink
fonte
Eu tentei isso. Mas, em seguida, o script do script pedirá uma pasta de destino toda vez que um arquivo for solto na pasta. O que estou procurando é uma variante que, quando executo o código pela primeira vez, ele irá solicitar a escolha de uma pasta de destino (como a variante do MBUST). Mas quando a pasta de destino está mudando. Por exemplo, quando eu uso um HD externo para fazer backup de um dia e outro dia eu uso outro HD externo como Backup (para sessões de fotos) Eu quero que o script veja que a pasta de destino está faltando e ele pedirá para definir um novo alvo pasta. Não sei se é possível. Obrigado!
Pat78
Desculpe pela falta de clareza pessoal! realmente aprecio toda sua ajuda
Pat78
Uma variante da minha última iteração deve servir como modelo a ser manipulado quando o destino ou a pasta de destino estiver ausente. E quando não estiverem faltando, o script usará a propriedade armazenada. Portanto, armazene cada variável de pasta como uma propriedade separada no início do script, como mostrei no meu script acima. Use isso como modelo e você terá exatamente o que deseja.
MBUST