• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Der Frühling ist auch in den eingesandten Fotos deutlich zu erkennen. Zeigt uns, wer Euer Favorit ist! hier geht es lang für Euer Voting --> Klick

Applescript-Droplet soll Unterordner abarbeiten

HFPatzi

Jonagold
Registriert
29.07.10
Beiträge
18
Hallo Äppler ;),

ich hänge mittlerweile seit Tagen an einem Problem, bei dem ich einfach keine Lösung finde. Ich habe ein Applescript-Droplet erstellt welches .tif-Dateien in Photoshop öffnet, Alpha-Kanäle entfernt, auf HG-Ebene reduziert und das ganze als .jpg mit bestimmten Vorgaben speichert. Danach werden die tiffs in einen davor im Quellordner angelegten Ordner Verschoben.

Soweit funktioniert das Droplet einwandfrei. Nun ist es aber so das die Ordnerstruktur wie folgt aussieht:


Hauptordner

  • Unterordner 1: Bild1, Bild 2, Bild 3, etc...
  • Unterordner 2: Bild1, Bild 2, Bild 3, etc...
  • Unterordner 3: Bild1, Bild 2, Bild 3, etc...
  • ..

Es sind einfach viel zu viele Unterordner, als dass ich diese einzeln, nacheinander auf das Droplet ziehen könnte (meistens über 100 Unterordner).


Gibt es eine Möglichkeit, dass ich einfach nur den Hauptordner auf mein Droplet ziehe und dieses dann in die jeweiligen Unterordner geht und in diesem dann die dort vorhandenen Bilder abarbeitet und verschiebt?

Habe natürlich schon über die Suchfunktion gesucht und auch gegoogelt aber nichts brauchbares gefunden. Falls es doch schon einen Thread zu diesem Thema geben sollte, einfach sagen.

Würde mich über Hilfreiche Tipps oder sogar eine Lösung freuen.

Danke!

Der Patzi


P.s.: Hier noch mein Script:

Code:
on open {input}
    
    
    tell application "Finder" to set theFiles to document files of input whose name extension is in {"tif"}
    
    
    --In Photoshop öfffnen und als jpg in Quellordner speichern:
    
    repeat with oneFile in theFiles
        tell application "Adobe Photoshop CS4"
            
            
            open (oneFile as alias) showing dialogs {never}
            
            
            if exists (delete (every channel whose kind is not component channel) of document 1) then
            end if
            
            flatten document 1
            
            save document 1 in input as JPEG with options {embed color profile:true, format options:standard, quality:5} appending lowercase extension without copying
            
            close document 1 saving no
            
        end tell
    end repeat
    
    
    
    --Tiffs in Ordner verschieben
    
    tell application "Finder"
        
        make new folder in input with properties {name:"Altlasten"}
        
        set tiffs to (document files of input whose name extension is in {"tif"})
        move tiffs to folder "Altlasten" of input
        
    end tell
    
    return input
end open
 

Streptokokke

Jonagold
Registriert
11.12.10
Beiträge
21
Hallo,
also du hast mehr Ahnung davon als ich, kann dein Problem selbst nicht lösen. Aber ich habe mal ein Script gefunden, dass in der Lage ist, die Dokumente in einem Ordner inklusive aller Unterordner zu zählen. Dabei ist auch eine Droplet-Version. Vielleicht lässt sich das Zählen durch deine Aktion ersetzen.

Hoffe das hilft,
Gruß


Code:
global anzahlFiles

on run
	set anzahlFiles to 0
	set theFileList to (choose folder) as list
	repeat with theFile in theFileList
		File_or_Folder(theFile)
	end repeat
	tell application "Finder"
		display dialog "Es befinden sich total " & anzahlFiles & " Dateien innerhalb dieses Ordners." buttons {"OK"} default button {"OK"}
	end tell
end run


on open theFileList
	set anzahlFiles to 0
	repeat with theFile in theFileList
		File_or_Folder(theFile)
	end repeat
	tell application "Finder"
		display dialog "Es befinden sich total " & anzahlFiles & " Dateien innerhalb dieses Ordners." buttons {"OK"} default button {"OK"} giving up after 20
	end tell
end open


on File_or_Folder(theFile)
	set theInfo to info for theFile
	if folder of theInfo then
		tell application "Finder"
			set FolderList to every item of theFile
		end tell
		repeat with theFolder in FolderList
			set theFolder to theFolder as alias
			my File_or_Folder(theFolder)
		end repeat
	else
		ProcessIt(theFile)
	end if
end File_or_Folder


on ProcessIt(theFile)
	set anzahlFiles to anzahlFiles + 1
end ProcessIt
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Ich glaube was du suchst ist "entire contents"

Probier mal das aus:

In deinem Script fügst du nach
Code:
on open {input}
folgende Zeile ein:
Code:
set theFiles to (getFilesRecursively(input, "tif"))

und dann zusätzlich noch nach
Code:
end open
folgenden Handler:
Code:
on getFilesRecursively(fContainer, fExt)
	tell application "Finder"
		set recursiveFileList to entire contents of fContainer as alias list
		
		set resultFileList to {}
		repeat with aFile in recursiveFileList
			if name extension of aFile contains fExt then
				set resultFileList to resultFileList & aFile
			end if
		end repeat
	end tell
	
	return resultFileList --this is an alias list!!!
end getDocumentFilesRecursively


Das
Code:
tell application "Finder" to set theFiles to document files of input whose name extension is in {"tif"}
müsstest du auskommentieren.

Weiter unten müsstest du das
Code:
open (oneFile as alias)
in
Code:
open oneFile
abändern, weil der Handler eine Aliasliste zurückgibt. Ich bin mir fast sicher, dass das einen Fehler ausspuckt, wenn du das nicht änderst (ich hab's jetzt nicht ausprobiert....).

Dir wird evtl. auffallen, dass der Handler nur nach "name extension" guckt und nicht, wie bei dir, auch nach der "class" (document file). Das ist so, weil die rekursive Liste als Aliasliste geladen wird, was dazu führt das die class jedes Items "alias" ist. Wenn du unbedingt die class checken musst, dann würde es so funktionieren:
Code:
on getDocumentFilesRecursively(fContainer, fExt)
	tell application "Finder"
		set recursiveFileList to entire contents of fContainer
		
		set resultFileList to {}
		repeat with aFile in recursiveFileList
			if name extension of aFile contains fExt ¬
				and class of aFile is document file then
				set resultFileList to resultFileList & (aFile as alias)
			end if
		end repeat
	end tell
	
	return resultFileList --this is an alias list!!!
end getDocumentFilesRecursively
Vorsicht: Das Ergebnis ist immer noch eine Aliasliste!

Da du von über hundert Unterordnern geschrieben hast, würde ich dir, falls keine Probleme auftreten, die erste Variante empfehlen. Eine Aliasliste ist schneller geladen als eine ...uhm... "Referenzliste" (nenn ich jetzt einfach mal so... ^^).
 

HFPatzi

Jonagold
Registriert
29.07.10
Beiträge
18
Hi ihr zwei,

vielen Dank schonmal für die Hilfe. Ich werde mich gleich mal dranmachen und ein wenig rumprobieren.
Werd euch das Ergebnis wissen lassen.

Greetz

Patzi
 

HFPatzi

Jonagold
Registriert
29.07.10
Beiträge
18
Hey fyysh,

habe deine Erklärung mal in die Tat umgesetzt. Funktioniert auch in sofern, dass Photoshop sich alle Dateien aus allen Unterordnern krallt und auch verarbeitet. Nur gespeichert werden diese dann alle zusammen in den Hauptordner (hängt wahrscheinlich mit dem "save document 1 in input"-command zusammen).
Weißt du eventuell wie er es Schafft, das jpg in den Selben Unterordner zu speichern, von dem aus es geöffnet wurde? Habe auch schonmal beim save-command das "in input" weggelassen, das Problem dabei ist, dass dann in Photoshop für jedes Bild der speichern unter-Dialog aufgeht und das ist bei ca. 500-1000 Bildern dann doch etwas lästig ;)

Ist bei deinem Scriptvorschlag eventuell irgendwo eine Variable mit der Herkunft des Originalbildes definiert? Dann würde ich einfach die nehmen und anstatt "save in input", dann halt "save in Herkunftsvariable" schreiben und alles müsste rein theoretisch funktionieren. Habs leider nicht ganz so mit den ganzen Variablen in Applescript ;)

Dank dir schonmal im Vorraus und dir natürlich auch Streptokokke (werde mir das von dir Vorgeschlagene Script auch mal anschauen).

Greetz

Patzi
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Hi,

probier mal so:

änder das
Code:
            flatten document 1
            
            save document 1 in input as JPEG with options {embed color profile:true, format options:standard, quality:5} appending lowercase extension without copying

in

Code:
            flatten document 1

            tell app "finder" to set output to (container of oneFile as alias)        
            save document 1 in output as JPEG with options {embed color profile:true, format options:standard, quality:5} appending lowercase extension without copying
 

HFPatzi

Jonagold
Registriert
29.07.10
Beiträge
18
Hey fyysh!

hab gerade einen "kleinen" Testlauf mit meinem Script gemacht (77 Unterordner, 713 Bilder).
Hat zwar seine Zeit gedauert (45-60 Minuten) aber lief fast ohne Probleme durch, nur am Schluss, als es um das Löschen der 713 tiff-Bilder ging hat es einen Timeout gegeben. Die Bilder wurden aber trotzdem gelöscht.

Hier mein fertiges Script:

Code:
on open {input}
    
    set theFiles to (getFilesRecursively(input, "tif"))
    
    
    
    
    
    --#####In Photoshop öfffnen und als jpg in Quellordner speichern#####
    
    
    repeat with oneFile in theFiles
        
        
        
        tell application "Adobe Photoshop CS4"
            
            
            open oneFile showing dialogs {never}
            
            
            if exists (delete (every channel whose kind is not component channel) of document 1) then
            end if
            
            flatten document 1
            
            tell application "Finder" to set output to (container of oneFile as alias)
            
            save document 1 in output as JPEG with options {embed color profile:true, format options:standard, quality:5} appending lowercase extension without copying
            
            close document 1 saving no
            
        end tell
    end repeat
    
    
    
    
    
    --#####Tiffs löschen#####
    
    
    
    tell application "Finder"
        
        
        delete (document files of entire contents of input whose name extension is in {"tif"})
        
        
    end tell
end open


on getFilesRecursively(fContainer, fExt)
    tell application "Finder"
        set recursiveFileList to entire contents of fContainer as alias list
        
        set resultFileList to {}
        repeat with aFile in recursiveFileList
            if name extension of aFile contains fExt then
                set resultFileList to resultFileList & aFile
            end if
        end repeat
    end tell
    return resultFileList
end getFilesRecursively
Sollte dir noch etwas auffallen, das besser gemacht werden könnte bzw. etwas, das den ganzen ablauf etwas beschleunigt, kannst du's mir gerne mitteilen. Bin für jede Hilfe Dankbar.

Jetzt bleibt mir nur noch, ein Script zu schreiben, das die Dateigröße der jpg's checkt und alle Bilder über 2MB zu einem gewissen Prozentsatz in Photoshop verkleinert ;)

Dir aber auf jeden fall nochmal vielen vielen Dank, hast mir sehr geholfen!


Greetz

Patzi
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Hi nochmal,

du hast dir da am Schluss ne Bremse eingebaut. Lösche die tifs besser im loop oben, denn die Aliase hast du schon - du brauchst die nicht neu laden (du lädst sogar Referenzen - das dauert, wie gesagt, noch länger...).

d.h. das weg:
Code:
    --#####Tiffs löschen#####
    
    
    
    tell application "Finder"
        
        
        delete (document files of entire contents of input whose name extension is in {"tif"})
        
        
    end tell


Und dafür weiter oben so abändern:
Code:
            tell application "Finder" to set output to (container of oneFile as alias)
            
            save document 1 in output as JPEG with options {embed color profile:true, format options:standard, quality:5} appending lowercase extension without copying
            
            close document 1 saving no

            tell app "finder" to delete oneFile --original tiff löschen
 

HFPatzi

Jonagold
Registriert
29.07.10
Beiträge
18
Hey fyysh!

Wenn auch etwas verspätet, aber vielen dank nochmal für deine Hilfe. Script ist optimiert und rechnet jetzt zusätzlich alle Bilder, die Größer als 2MB sind in Photoshop auf 50% runter. Klappt alles prima und wird auch schon fleißig in unserer Firma eingesetzt :D

Man kann diesen Thread demnach also als gelöst betrachten.

Cheerz

Patzi