Este código AppleScript funciona para mí usando la última versión de macOS Mojave.
Este código recorrerá cada elemento de la papelera, devolviendo cada elemento a su ubicación original.
Si alguna de las carpetas de origen originales de los archivos en la Papelera ya no existe, el repeat until trashCount is 0
comando saldrá del bucle. Los archivos restantes en la Papelera solo serán archivos que no se pudieron volver a colocar por este motivo.
ACTUALIZAR
Como es posible seleccionar un elemento en su escritorio durante el ciclo de repetición del proceso de volver a colocar los archivos de la papelera, el elemento de escritorio seleccionado puede quedar atrapado en el proceso y trasladarse a la papelera. Para evitar este escenario, agregué un código que bloqueará los elementos de escritorio actualmente desbloqueados y también los desbloqueará al final del script.
Debido a que todos los elementos de escritorio ahora están bloqueados ... Durante el proceso de volver a colocar archivos de la papelera, si por alguna razón selecciona accidentalmente un archivo o carpeta en su escritorio y el código intenta procesar ese elemento de escritorio seleccionado ... genere una ventana de diálogo que mencione que el elemento está bloqueado y pregunte si desea continuar enviándolo a la papelera. El bloque de información de Eventos del sistema hacia el final del script manejará cualquiera de esos cuadros de diálogo que se hayan generado.
property desktopFolder : path to desktop
property unlockedFiles : missing value
tell application "Finder"
set trashCount to count of every item of trash
set unlockedFiles to (items of desktopFolder whose locked is false)
repeat with i in unlockedFiles
set locked of i to true
end repeat
end tell
repeat until trashCount is 0
tell application "Finder" to set orphanCount to count of every item of trash
putFilesBack()
tell application "Finder" to set trashCount to count of every item of trash
if orphanCount is equal to trashCount then exit repeat
end repeat
delay 1
tell application "System Events"
repeat until not (exists of button "Stop" of scroll area 1 of window 2 of application process "Finder")
if exists of button "Stop" of scroll area 1 of window 2 of application process "Finder" then
click button "Stop" of scroll area 1 of window 2 of application process "Finder"
end if
end repeat
end tell
tell application "Finder"
close every Finder window
delay 1
repeat with i in unlockedFiles
set locked of i to false
end repeat
end tell
on putFilesBack()
global trashFiles, trashCount, thisItem
tell application "Finder"
set trashFiles to every item of trash
set frontmost to true
repeat while not frontmost
delay 0.1
end repeat
my closeFinderWindows()
end tell
delay 0.1
tell application "System Events"
tell application process "Finder"
repeat with i from 1 to count of trashFiles
set thisItem to item i of trashFiles
delay 0.1
set frontmost to true
select thisItem
delay 0.1
try
key code 51 using {command down}
end try
delay 0.1
my closeFinderWindows()
delay 0.1
end repeat
end tell
end tell
tell application "Finder" to set trashCount to count of every item of trash
end putFilesBack
on closeFinderWindows()
tell application "Finder"
set finderWindowRef to (a reference to (every Finder window whose name is not "Trash"))
set finderWindowRef to contents of finderWindowRef
close (items of finderWindowRef)
end tell
end closeFinderWindows