[GastForen Programmierung/Entwicklung AppleScript Vom Script zum Droplet?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Vom Script zum Droplet?

xD
Beiträge gesamt: 133

19. Apr 2011, 15:08
Beitrag # 1 von 5
Bewertung:
(3089 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Scripter,

ich weiß nicht, wie ich dieses Script ändern muss, damit alle Dateien, die ich draufziehe auf fünf Zeichen gekürzt werden. Das folgende Skript verlangt, dass ein Ordner ausgewählt wird.

Ich hätte das gern als Droplet.
*Datei drauf* - *Dateiname wird gekürzt* - *Ursprungsdatei wird gelöscht*

Ich kann zwar ein Droplet draus machen, allerdings funktioniert das dann nicht mehr. Kann wer helfen? Dankeschön!




-- auf wie viele Zeichen sollen die Dateinamen reduziert werden
set charNo to 5

-- wie ist das Suffix der zu ändernden Datein
set myFileSufix to ".pdf"

-- Wo soll das Log gesichert werden, das nicht geänderte Dateien protokolliert
set logPath to (path to desktop folder as string) & "Log.txt"

-- >>> Suchen
set myFiles to paragraphs of (do shell script "find " & quoted form of POSIX path of (choose folder) & " -iname \"*" & myFileSufix & "\"")

-- Schleife, die die gefunden Dateien abarbeitet
repeat with nFile in myFiles

try
-- Dateinamen holen
set AppleScript's text item delimiters to "/"
set nFileName to last text item of nFile

-- Mutterornder zu der Datei holen
set AppleScript's text item delimiters to nFileName
set nFileParent to first text item of nFile

-- Dateinmane auf gewünschte Anzahl Zeichen schneiden
if ((count of (every character of nFileName)) > charNo) then set nFileNameNew to my schneidenAnfangBeibehlaten(nFileName, charNo)

-- Neuen Dateinamen + Mutterordner verbinden
set nFileNew to nFileParent & nFileNameNew & myFileSufix

-- prüfen, ob es schon eine Datei mit dem Namen gibt
try
alias (nFileNew as POSIX file)
my schreibeZuDatei(logPath, nFileNew & return, false, false)
on error
try
do shell script "mv " & quoted form of nFile & " " & quoted form of nFileNew
on error
-- hier ein Log?
end try
end try

on error
-- hier ein Log?
end try

end repeat



-- Anzahl Zeichen vom Anfang erhalten
on schneidenAnfangBeibehlaten(txt, anzahl)
set AppleScript's text item delimiters to ""
return (characters 1 thru anzahl of txt) as string
end schneidenAnfangBeibehlaten


-- zu Datei schreiben
on schreibeZuDatei(pfadZuDatei, schreibeInhalt, ueberschreiben, alsListe)
try
set the pfadZuDatei to the pfadZuDatei as text
set the offeneDatei to open for access file pfadZuDatei with write permission
if ueberschreiben is true then set eof of the offeneDatei to 0
if (alsListe is true) then
write schreibeInhalt to the offeneDatei starting at eof as list
else
write schreibeInhalt to the offeneDatei starting at eof
end if
close access the offeneDatei
return true
on error fehlerMeldung number fehlerNr
close access file pfadZuDatei
my fehlerProtokoll(fehlerNr, fehlerMeldung)
return false
end try
end schreibeZuDatei

X

Vom Script zum Droplet?

Hans Haesler
  
Beiträge gesamt: 5822

19. Apr 2011, 15:49
Beitrag # 2 von 5
Beitrag ID: #469557
Bewertung:
(3076 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo xD,

welches Mac OS wird eingesetzt? PowerPC oder Intel-Maschine?

Wenn ich es richtig verstehe, dann sollte das Droplet die Namen von PDF-Dateien kürzen. Auf fünf Zeichen.

Aber was ist, wenn eine Datei "abc.pdf" heisst?

Unklar ist auch *Ursprungsdatei wird gelöscht*. Die Dateien werden doch nur umbenannt und nicht in eine neue Datei geschrieben.

Ich werde erst heute Abend versuchen können, eine erste Version zu schreiben.

Gruss, Hans


als Antwort auf: [#469548]

Vom Script zum Droplet?

Hans Haesler
  
Beiträge gesamt: 5822

19. Apr 2011, 23:17
Beitrag # 3 von 5
Beitrag ID: #469589
Bewertung:
(3046 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo xD,

nachstehend der Code für ein Droplet, welches die Namen von PDF-Dateien auf fünf Zeichen kürzt (das Suffix nicht gezählt).

Die Kommentare versuchen, zu erklären, was geschieht.

Code
(* 
NamenKuerzen_01d
Die Namen von gedroppten PDF-Dateien auf fünf Zeichen kürzen.
© 19.04.2011 / Hans Häsler, Châtelard 52, CH-1018 Lausanne / E-mail: hsa@ringier.ch
*)

-- auf wieviele Zeichen sollen die Dateinamen reduziert werden
property charNo : 5

-- das Suffix der zu ändernden Dateien
property fileSuffix : ".pdf"

global ctr

-- einen Dialog zeigen, falls der Anwender einen Doppelklick auf das Droplet macht
on run
display dialog "Dateien und Ordner auf dem Icon
dieses Droplets deponieren." buttons "OK" default button 1 with icon 0
end run

-- der 'open handler', welcher auf das Fallenlassen von Objekten reagiert
on open allObjects
set ctr to 0
-- Wiederholschleife, welche alle gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
-- den Anwender über das Ergbenis der Aktion informieren
if ctr is 0 then
display dialog "Fertig." & return & return & "Alle PDF-Datei-Namen wurden gekürzt." buttons ¬
"OK" default button 1 with icon 1
else if ctr is 1 then
display dialog "Fertig." & return & return & "Ein PDF-Datei-Name nicht gekürzt." buttons ¬
"OK" default button 1 with icon 2
else
display dialog "Fertig." & return & return & ctr & " PDF-Datei-Namen nicht gekürzt." buttons ¬
"OK" default button 1 with icon 2
end if
end open

-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist.
-- Bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt
-- (d.h. zum aktuellen Handler geschickt)
-- Dateien werden zum Handler 'processFile' gesandt
on processObject(aObject)
-- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner
if (aObject as string) ends with ":" then
-- die Liste des Inhalts wird erstellt (ohne unsichtbare Dateien)
set contentsList to list folder aObject without invisibles
-- der Finder öffnet den Ordner, damit man sieht, dass etwas geschieht
tell application "Finder" to open folder aObject

-- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler,
-- in welchem sie sich selbst befindet
repeat with anItem in contentsList
set objPath to ((aObject as Unicode text) & anItem)
processObject(objPath as alias)
end repeat
-- der Finder schliesst den Ordner (dieses Öffnen/Schliessen zeigt
-- dem Anwender, was gerade geschieht)
tell application "Finder" to close window of folder aObject

-- wenn das Objekt eine Datei ist, dann wird der Pfad dem Handler 'processFile' übergeben
else
processFile(aObject as Unicode text)
end if
end processObject

-- in diesem Handler wird der Name der Datei festgestellt und gekürzt; dann wird die Datei umbenannt
on processFile(aFile)
-- den Namen der Datei speichern
tell application "Finder" to set curName to name of file aFile
-- wenn es eine PDF-Datei ist
if curName ends with fileSuffix then
-- den Ordner-Pfad speichern
tell application "Finder" to set folderPath to (container of file aFile) as Unicode text
-- wenn der Name länger als 9 Zeichen ist
if (count of curName) is greater than 9 then
-- den neuen Namen zusammensetzen (5 Zeichen plus ".pdf")
set newName to text 1 thru 5 of curName & fileSuffix
set newFile to (folderPath & newName) as string
try
-- prüfen, ob die Datei existiert
alias newFile
-- den Zählerwert erhöhen
set ctr to ctr + 1
-- die Log-Datei ergänzen
writeFile(aFile)
on error
-- versuchen, die Datei umzubenennen
try
tell application "Finder" to set name of file aFile to newName
end try
end try
end if
end if
end processFile

-- in die Log-Datei schreiben
on writeFile(aFile)
-- wo soll das Log gesichert werden, das nicht geänderte Dateien protokolliert
set logPath to (path to desktop folder as string) & "Log.txt"
try
set logFile to open for access file logPath with write permission
write (aFile & return) to logFile starting at eof
close access logFile
on error
try
close access logFile
end try
end try
end writeFile

Der Code ist rekursiv, das heisst: Jedes gedroppte Objekt wird einem Handler übergeben, welcher prüft, ob es sich um einen Ordner oder um eine Datei handelt. Falls es ein Ordner ist, wird dessen Inhalt aufgelistet und die einzelnen Elemente werden dem selben Handler zum Untersuch übergeben. Ist es eine Datei, wird sie zum Handler geschickt, welcher Dateien behandelt. Ist es ein Ordner, wird dessen Inhalt aufgelistet usw. usf.

Der langen Rede kurzer Sinn: Es kann eine einzelne Datei auf das Icon des Droplets gezogen werden. Oder mehrere Dateien aufs Mal. Oder ein Ordner, welcher die Dateien enthält. Auch Unterordner werden berücksichtigt.

Gruss, Hans


als Antwort auf: [#469557]

Vom Script zum Droplet?

xD
Beiträge gesamt: 133

20. Apr 2011, 07:42
Beitrag # 4 von 5
Beitrag ID: #469594
Bewertung:
(3027 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Hallo xD,

welches Mac OS wird eingesetzt? PowerPC oder Intel-Maschine?

Wenn ich es richtig verstehe, dann sollte das Droplet die Namen von PDF-Dateien kürzen. Auf fünf Zeichen.

Aber was ist, wenn eine Datei "abc.pdf" heisst?

Unklar ist auch *Ursprungsdatei wird gelöscht*. Die Dateien werden doch nur umbenannt und nicht in eine neue Datei geschrieben.


Hallo Herr Haesler,

momentan arbeite ich noch mit OSX 10.4, ab nächster Woche mit 10.6, :) Intel Mac. Wenn die Datei weniger als 5 Zeichen hat, muss nichts gekürzt werden. Mit "Ursprungsdatei löschen" meinte ich, dass nur die umbenannten Dateien erhalten bleiben und die Eingangsdateien ersetzen.

Habe das Droplet schon getestet und bin begeistert! Läuft einwandfrei. Die Kommentare zu den einzelnen Schritten sind sehr hilfreich.
Ein dickes Dankeschön!


als Antwort auf: [#469589]

Vom Script zum Droplet?

Hans Haesler
  
Beiträge gesamt: 5822

20. Apr 2011, 07:56
Beitrag # 5 von 5
Beitrag ID: #469595
Bewertung:
(3016 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo xD,

bitteschön.

Nach dem Wechsel auf 10.6 musst Du sehr wahrscheinlich das Droplet öffnen und ein "Speichern-unter..." ausführen, damit es ans neue System angepasst wird.

Beim Testen, ob der Name gekürzt werden muss, sollte das Suffix nicht miteinbezogen werden. Deshalb testet das Droplet, ob der komplette Dateiname (inkl. Suffix) mehr als neun Zeichen umfasst. Sind es 9 (oder weniger) wird nichts gekürzt.

Zum "Ersetzen" der Dateien: Die Eingangsdateien werden auf das Droplet gezogen, mit dem Zweck, dass man den Pfad zu ihnen bekommt. Anschliessend wird der Name festgestellt und – falls notwendig – gekürzt. Schliesslich wird im "Finder" der Name der Datei geändert. Aber die Datei selbst bleibt unverändert und wird nicht ersetzt.

Gruss, Hans


als Antwort auf: [#469594]
X