• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Ordner anlegen wenn ein Kopierziel nicht existiert

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Hallo,

Wenn ich diesen String habe: "Festplatte:Users:Ich:Ordner:Datei.mov"
wie bekomme ich davon nur den Ordnerpfad, also ohne Dateiname?
"Festplatte:Users:Ich:Ordner:"

Die Datei existiert noch nicht.

Und wie legt man daraus direkt einen neuen Ordner an? Derzeit nutze ich immer "mkdir" mit einem POSIX-Pfad.
 

Terminal

Gast
Wenn du mal sagen würdest was du überhaupt vorhast?

Was hat denn ein Kopierziel mit dem Anlegen eines Ordners zu tun? Beides ist doch völlig unabhängig von einander möglich.

Und ansonsten ist es wie mit den Rechten. Du kannst nur welche vergeben oder ändern, wenn auch die dementsprechende Datei da ist. Du kannst also nur etwas wohin kopieren oder ein Verzeichnis anlegen wenn der Ort (wohin) bekannt ist.

Willst du mit deiner Anfrage hier Gehirnwindungen zerstören oder eine Schleife im Kleinhirn auslösen? Oder bist du auf Droge?
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Ok, ich wollte nicht soweit ausholen.

Ich möchte heruntergeladene WMV-Filme automatisch in Unterordner meines Film-Verzeichnisses einordnen. Dabei kommt es vor, dass der entsprechende Unterordner noch nicht existiert.

Ich habe eine Variable mov_folder mit "Festplatte:Users:Shared:Movies:"

Der füge ich mit & noch den Name des Films hinzu, also

Code:
set save_path to mov_folder & movie_name & ".mov"

Später sage ich QuickTime, es soll den Referenzfilm zur WMV-Datei abspeichern

Code:
save move 1 in save_path

Um nun automatisch die Filme in Unterordner zu verteilen ersetze ich in movie_name " [" durch ":", so dass z.B. aus

Code:
"Festplatte:Users:Shared:Movies:Spongebob [Episode].mov"

Code:
"Festplatte:Users:Shared:Movies:Spongebob:Episode.mov"

wird.

Wenn nun aber der Unterordner Spongebob nicht existiert, bricht das Skript ab.

Ich muss also irgendwie "Episode.mov" wieder aus dem Name entfernen, prüfen ob der Ordner existiert und diesen dann anlegen.

Also irgendwie so:

Code:
set movie_folder to folderpath of save_path
if not (exists movie_folder) then
	set posix_folder to POSIX path of mov_folder
	do shell script "mkdir " & posix_folder
end if

folderpath habe ich mir hier jetzt nur ausgedacht. Ich will eigentlich nur wissen, wie ich den Dateinamen aus dem String entferne.

Und wenn's unbedingt interessiert hier der ganze Code, aber ich warne vor der Gehirnkrebsgefahr, ich habe immer noch nicht ganz die Logik von AppleScript durchschaut, deswegen ist's wohl kein Musterbeispiel von gutem Code. Ich mache immer nur trial&error und raffe nicht mal was da passiert. Z.B. warum kann ich die Funktion replace_chars nicht in einem tell app "Finder"-Block verwenden. Aber egal.

Code:
-- WMV2MOV v0.2
-- 30.9.2006 by Wolfgang Reszel

on open of movs
	set mov_folder to "Festplatte:Users:Shared:Movies:"
	set wmv_folder to "Festplatte:Users:Shared:Movies:.Rohfilme:"
	
	tell application "Finder"
		if not (exists mov_folder) then
			set posix_folder to POSIX path of mov_folder
			do shell script "mkdir " & posix_folder
			do shell script "touch " & posix_folder & ".localized"
		end if
		if not (exists wmv_folder) then
			set posix_folder to POSIX path of wmv_folder
			do shell script "mkdir " & posix_folder
		end if
	end tell
	
	repeat with i from 1 to number of items in movs
		set this_item to (item i of movs) as alias
		tell application "QuickTime Player"
			open this_item
			set movie_name to full text of annotation 2 of movie 1 as string
		end tell
		set movie_name to replace_chars(movie_name, " : ", " - ")
		set movie_name to replace_chars(movie_name, ": ", " - ")
		set movie_name to replace_chars(movie_name, ":", "-")
		set movie_name to replace_chars(movie_name, "/", "-")
		set movie_name to replace_chars(movie_name, "‰", "ä")
		set movie_name to replace_chars(movie_name, "ˆ", "ö")
		set movie_name to replace_chars(movie_name, "?", "ß")
		set movie_name to replace_chars(movie_name, "¸", "ü")
		set movie_name to replace_chars(movie_name, "?", "°")
		set movie_name to replace_chars(movie_name, "ƒ", "Ä")
		set movie_name to text 1 thru -2 of movie_name as string
		set save_location to (a reference to (mov_folder & movie_name))
		set save_movie to true
		tell application "Finder"
			if (the file (wmv_folder & name of this_item as string) exists) then
				display dialog (wmv_folder & name of this_item as string) & return & "existiert bereits und wird übersprungen" buttons {"Ok"} default button "Ok"
				set save_movie to false
			else
				-- set theDate to  creation date of this_item
				-- set theDate to ((short date string of theDate) as string) & " " & (time of theDate) as string
				set dest_name to name of this_item as string
				set theDate to ""
				if movie_name does not contain "[" and movie_name does not contain "]" or movie_name contains "[Kochen mit" then
					if dest_name contains ".avi.wmv" then
						set theDate to ":" & text -23 thru -20 of dest_name & text -27 thru -25 of dest_name & "-" & text -29 thru -28 of dest_name & text -19 thru -15 of dest_name
					else
						set theDate to ":" & text -19 thru -16 of dest_name & text -23 thru -21 of dest_name & "-" & text -25 thru -24 of dest_name & text -15 thru -11 of dest_name
					end if
				end if
				
				if (the file (save_location & movie_name & theDate & ".mov") exists) then
					set save_movie to false
					display dialog movie_name & theDate & ".mov" & return & "existiert bereits und wird übersprungen ..." buttons {"Ok"} default button "Ok"
				else
					set movie_name to (movie_name & theDate) as string
				end if
				
			end if
		end tell
		
		if movie_name contains "[" and movie_name contains "]" then
			set movie_name to replace_chars(movie_name, " [", ":")
			set movie_name to replace_chars(movie_name, "[", ":")
			set movie_name to replace_chars(movie_name, "]", "")
		end if
		
		-- Hier soll nich eine Prüfung hin, ob der Ordner existiert
		
		tell application "Finder"
			if (the file (mov_folder & movie_name & ".mov") exists) then
				set save_movie to false
				display dialog movie_name & theDate & ".mov" & return & "existiert bereits und wird übersprungen ..." buttons {"Ok"} default button "Ok"
			end if
		end tell
		
		set save_location to (mov_folder & movie_name & ".mov") as string
		
		tell application "QuickTime Player"
			tell movie 1
				set full text of annotation "Full Name" to movie_name
				make new annotation with properties {name:"Original Source", full text:wmv_folder & dest_name}
				set presentation mode to normal
				set presentation size to screen
				set auto present to true
				set auto play to true
				set auto quit when done to true
			end tell
		end tell
		
		tell application "Finder"
			if save_movie is true then
				move this_item to wmv_folder
			end if
		end tell
		
		tell application "QuickTime Player"
			if save_movie is true then
				--	save self contained movie 1 in save_location
				save movie 1 in save_location
				tell application "Finder"
					set comment of file save_location to dest_name
				end tell
			end if
			close movie 1 saving no
		end tell
	end repeat
end open

on replace_chars(this_text, search_string, replacement_string) --This is Apple's standard replace text handler
	set AppleScript's text item delimiters to the search_string
	set the item_list to every text item of this_text
	set AppleScript's text item delimiters to the replacement_string
	set this_text to the item_list as string
	set AppleScript's text item delimiters to ""
	return this_text
end replace_chars
 

Terminal

Gast
Naja, das ist ja schon mal was mit dem man arbeiten kann. Sicher wird sich nun jemand finden der sich deinem Problem annimmt.

Aber mal unter uns gesagt: Soviel Filme aufeinmal lädt man doch nicht aus dem Internet, dass man diese nicht auch einzeln in das Verzeichnis seiner Wahl tun könnte, oder?

Es sei denn, du ziehst 24 Stunden täglich mit Bit Torrent und das wollen wir hier wirklich nicht noch unterstützen. ;)
 

Tekl

Fairs Vortrefflicher
Registriert
01.06.05
Beiträge
4.630
Hi,

ich habe jetzt nach langem rumgefummel nun eine Funktion gebastelt, welche meine Wünsche erfüllt:

Code:
on getFolderPath(thefile)
	set oldDelims to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {":"}
	set mypath to last text item of thefile
	set mylength to (length of thefile) - (length of mypath)
	set mypath to text 1 through mylength of thefile
	set AppleScript's text item delimiters to oldDelims
	return mypath
end getFolderPath

Strange finde ich auch, dass ich am Anfang des Skript einen Ordner wie folgt auf Existenz prüfe

if not (exists mov_folder) then

später im Skript muss ich aber

if not (exists the folder save_folder) then

schreiben

Wenn ich am Anfang the folder schreibe, klappts nicht und wenn ich später im Code the folder entferne klappt's da nicht. AppleScript ist da irgendwie nicht sehr konsistent. Oder ich hab's nicht begriffen.

Achja, ich bin Kunde bei Save.tv und mein Mac ist mein Fernseh-Ersatz. Ich lade täglich so 10 Filme runter. Da die Filme einen komischen Dateinamen tragen, welcher in Frontrow meist nicht zu lesen ist, habe mich mir dieses Umbenennen-Skript gemacht. Und da es eh schon die Dateien richtig verschiebt, soll es die auch gleich korrekt einsortieren. Ich habe kein Bock 15 Minuten pro Tag Filme zu speichern, umzubenennen und einzusortieren. Das soll automatisch gehen, wozu habe ich denn einen Computer?

Code:
-- WMV2MOV v0.2
-- 30.9.2006 by Wolfgang Reszel

on open of movs
	set mov_folder to "Festplatte:Users:Shared:Movies:"
	set wmv_folder to "Festplatte:Users:Shared:Movies:.Rohfilme:"
	
	tell application "Finder"
		if not (exists mov_folder) then
			set posix_folder to POSIX path of mov_folder
			do shell script "mkdir \"" & posix_folder & "\""
			do shell script "touch \"" & posix_folder & ".localized\""
		end if
		if not (exists wmv_folder) then
			set posix_folder to POSIX path of wmv_folder
			do shell script "mkdir " & posix_folder
		end if
	end tell
	
	repeat with i from 1 to number of items in movs
		set this_item to (item i of movs) as alias
		tell application "QuickTime Player"
			open this_item
			set movie_name to full text of annotation 2 of movie 1 as string
		end tell
		set movie_name to replace_chars(movie_name, " : ", " - ")
		set movie_name to replace_chars(movie_name, ": ", " - ")
		set movie_name to replace_chars(movie_name, ":", "-")
		set movie_name to replace_chars(movie_name, "/", "-")
		set movie_name to replace_chars(movie_name, "‰", "ä")
		set movie_name to replace_chars(movie_name, "ˆ", "ö")
		set movie_name to replace_chars(movie_name, "?", "ß")
		set movie_name to replace_chars(movie_name, "¸", "ü")
		set movie_name to replace_chars(movie_name, "?", "°")
		set movie_name to replace_chars(movie_name, "ƒ", "Ä")
		set movie_name to text 1 thru -2 of movie_name as string
		set save_location to (a reference to (mov_folder & movie_name))
		set save_movie to true
		tell application "Finder"
			if (the file (wmv_folder & name of this_item as string) exists) then
				display dialog (wmv_folder & name of this_item as string) & return & "existiert bereits und wird übersprungen" buttons {"Ok"} default button "Ok"
				set save_movie to false
			else
				-- set theDate to  creation date of this_item
				-- set theDate to ((short date string of theDate) as string) & " " & (time of theDate) as string
				set dest_name to name of this_item as string
				set theDate to ""
				if movie_name does not contain "[" and movie_name does not contain "]" or movie_name contains "[Kochen mit" then
					if dest_name contains ".avi.wmv" then
						set theDate to ":" & text -23 thru -20 of dest_name & text -27 thru -25 of dest_name & "-" & text -29 thru -28 of dest_name & text -19 thru -15 of dest_name
					else
						set theDate to ":" & text -19 thru -16 of dest_name & text -23 thru -21 of dest_name & "-" & text -25 thru -24 of dest_name & text -15 thru -11 of dest_name
					end if
				end if
				
				if (the file (save_location & movie_name & theDate & ".mov") exists) then
					set save_movie to false
					display dialog movie_name & theDate & ".mov" & return & "existiert bereits und wird übersprungen ..." buttons {"Ok"} default button "Ok"
				else
					set movie_name to (movie_name & theDate) as string
				end if
				
			end if
		end tell
		
		if movie_name contains "[" and movie_name contains "]" then
			set movie_name to replace_chars(movie_name, " [", ":")
			set movie_name to replace_chars(movie_name, "[", ":")
			set movie_name to replace_chars(movie_name, "]", "")
		end if
		
		tell application "Finder"
			if (the file (mov_folder & movie_name & ".mov") exists) then
				set save_movie to false
				display dialog movie_name & theDate & ".mov" & return & "existiert bereits und wird übersprungen ..." buttons {"Ok"} default button "Ok"
			end if
		end tell
		
		set save_location to (mov_folder & movie_name & ".mov") as string
		
		set save_folder to getFolderPath(save_location) as string
		tell application "Finder"
			if not (exists the folder save_folder) then
				set posix_folder to POSIX path of save_folder
				do shell script "mkdir \"" & posix_folder & "\""
			end if
		end tell
		
		tell application "QuickTime Player"
			tell movie 1
				set full text of annotation "Full Name" to movie_name
				make new annotation with properties {name:"Original Source", full text:wmv_folder & dest_name}
				set presentation mode to normal
				set presentation size to screen
				set auto present to true
				set auto play to true
				set auto quit when done to true
			end tell
		end tell
		
		tell application "Finder"
			if save_movie is true then
				move this_item to wmv_folder
			end if
		end tell
		
		tell application "QuickTime Player"
			if save_movie is true then
				--	save self contained movie 1 in save_location
				save movie 1 in save_location
				tell application "Finder"
					set comment of file save_location to dest_name
				end tell
			end if
			close movie 1 saving no
		end tell
	end repeat
end open

on replace_chars(this_text, search_string, replacement_string) --This is Apple's standard replace text handler
	set AppleScript's text item delimiters to the search_string
	set the item_list to every text item of this_text
	set AppleScript's text item delimiters to the replacement_string
	set this_text to the item_list as string
	set AppleScript's text item delimiters to ""
	return this_text
end replace_chars

on getFolderPath(thefile)
	set oldDelims to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {":"}
	set mypath to last text item of thefile
	set mylength to (length of thefile) - (length of mypath)
	set mypath to text 1 through mylength of thefile
	set AppleScript's text item delimiters to oldDelims
	return mypath
end getFolderPath
 

Terminal

Gast
Da gebe ich dir allerdings Recht. Magst du es mal mit einem Shell-Script versuchen? Das kann vielleicht etwas konsistenter arbeiten? Schau dir auch mal die Funktionen von Automator an. Manchmal ist auch da etwas brauchbares dabei.
 

pete

Gast
Da gebe ich dir allerdings Recht. Magst du es mal mit einem Shell-Script versuchen? Das kann vielleicht etwas konsistenter arbeiten? Schau dir auch mal die Funktionen von Automator an. Manchmal ist auch da etwas brauchbares dabei.

Da hat Terminal völlig recht.

AppleScript hält einige Fallstricke bereit. Speziell im Hinblick auf Pfade und Aliase kann ich jedem Anfänger nur davon abraten, sich nur oberflächlich und ohne Grundkenntnisse mit AppleScript zu beschäftigen.

Ich persönlich habe nur noch im besonderen Einzelfall Zeit und Lust, personifizierte Scripts zu schreiben oder übergreifende Script-Module zu verschenken und auch noch zu erklären.

Schaue mal bei wikipedia.de nach "AppleScript". Da geben auch die Jungs von Fischer-Bayern ihr Bestes.
 

pete

Gast
Wenn ich am Anfang the folder schreibe, klappts nicht und wenn ich später im Code the folder entferne klappt's da nicht. AppleScript ist da irgendwie nicht sehr konsistent. Oder ich hab's nicht begriffen.

Lasse einfach generell das Wort "the" weg. "The" ist grundsätzlich optional.

Weiterhin: Jedes Programm (auch das Programm "Finder") erwartet im "tell"-Block Handleraufrufe, die es selbst versteht. Willst Du in einem "tell"-Block eigene Handler aufrufen, stelle "my" davor.

Noch was: Im Allgemeinen übernimmt man Verweise auf Dateien und Ordner als Aliase und im Allgemeinen sollte man sie auch als Aliase übergeben. Aber es lässt sich leichter scripten, wenn man zwischendurch die Aliase in Strings - respektive posix paths - oder in Listen wandelt.

Gruß, pete