1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Ordner anlegen wenn ein Kopierziel nicht existiert

Dieses Thema im Forum "AppleScript" wurde erstellt von Tekl, 30.09.06.

  1. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    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.
     
  2. Terminal

    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?
     
  3. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    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
    
     
  4. Terminal

    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. ;)
     
  5. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    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
    
     
  6. Terminal

    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.
     
  7. pete

    pete Gast

    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.
     
  8. pete

    pete Gast

    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
     

Diese Seite empfehlen