1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Wiese geht dieses Apple Script nicht? Tipp?

Dieses Thema im Forum "AppleScript" wurde erstellt von burning_angel, 04.07.09.

  1. burning_angel

    burning_angel Golden Delicious

    Dabei seit:
    07.01.08
    Beiträge:
    8
    Hi,

    Folgendes Apple Script funktioniert nicht. Es bleibt bei der Volume benennung "NO NAME" (das ist ein USB Stick der so heißt und den ich auch sehr ungern unbenennen möchte) hängen.
    Weiß jemand eine Lösung?
    Im endeffekt will ich nur einen Terminal befehl mit einem einzelnen klick ausführen, ohne das mühsam ins Terminal einfügen/eintippen zu müssen.

    Code:
    tell application "terminal"
    do script "find -x "/Volumes/NO NAME" -type f -iname '*.jpg' -exec cp -i {} "/Users/blabla/Desktop/NeuerOrdner/" \;"
     end tell
    gruß
    burning_angel
     
  2. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Was mir spontan einfaellt. Es lautet:

    Code:
    do shell script
    Ausserdem koennten die " problematisch werden. Vielleicht aussenrum Einfachquotes(') und innerhalb des Befehls dann Doppelquotes(")...Oder irgendwie sowas...

    Code:
    do script "find -x "/Volumes/NO NAME" -type f -iname '*.jpg' -exec cp -i {} "/Users/blabla/Desktop/NeuerOrdner/" \;"
    
     
  3. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Gänsefüsse halten nur die Chinesen für essbar

    edit
    Das gilt übrigens auch für den Backslash, der durch einen weiteren ebenso zu maskieren ist.
     
  4. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Hallo,

    Nein, das ist nicht korrekt.

    Terminal und do shell script haben zunächst nichts gemeinsam.
    Da werden leider immer viele Verwechslungen in Kombination gebracht.

    Es heißt einfach (ohne Terminal!):
    Code:
    -- Zielordner angeben
    set zielOrdner to POSIX path of (choose folder)
    
    -- Shell Anweisung
    do shell script "find " & quoted form of zielOrdner

    Generell sollte immer "quoted form" verwendet werden.

    Für Dein Skript bitte selbst anpassen.

    Viele Grüße
     
  5. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Äääähem.

    Das funktioniert schneller, zuverlässiger und eleganter als alles was du mit der strunzdoofen (weil absurd kryptischen) OSAskript-Kindergartennotation zusammenzunageln imstande bist.
    Selbst kilometerlange Shellskripten mit 10000 Zeilen Code jage ich so ein einziges mal durch 'sed' und in 0,05 Sekunden ist es ein funktionierendes UND immer noch lesbares OSA-Skript.
    Das deiner "Lehrbuchlösung" in Sachen Ablaufgeschwindigkeit um *Lichtjahre* überlegen ist, wohlgemerkt.

    Studenten, bitte hinsetzen.
    Danke sehr.
     
  6. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Werter Rastafari,

    was möchtest Du mir bzw. dem Forum sagen?
    Das Du die Dokumentation nicht gelesen hast?

    Wir kehren zur Ausgangssituation zurück:

    - burning_angel schreibt "terminal" mit "do script"
    - Zettt schreibt, dass es "do shell script" lauten soll

    Daraus schließt burning_angel jetzt, dass es so heißt

    Code:
    tell application "terminal"
    do shell script
     end tell
    ... und das ist einfach nur falsch.

    Die Dokumentation sagt:

    Code:
    do script v : Runs a UNIX shell script or command.
    do script [text] : The command to execute.
    [in tab, window, or any] : The tab in which to execute the command
    → tab : The tab the command was executed in.
    Wo der Unterschied ist erkläre ich euch Profis nicht.

    Rastafari, das war ziemlich daneben und Du solltest Dich entschuldigen.
    Mehr als neunmalkluges Geschwätz war das nicht.
    Du brauchst Dich mir und anderen gegenüber nicht behaupten und etablieren.
    Wer mit dummen ringt, der kann schließlich keine großen Ziele erreichen ;)

    Auf Grund der Fakten würde ich sagen, dass das ziemlich kontraproduktiv war und Du jetzt wohl den Studentepeter zugeschoben bekommen hast.
    Ich finde Deine Arroganz einfach fehlplatziert.

    Viele Grüße
     
    MacApple gefällt das.
  7. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Ach das meintest du?
    Na da hast du natürlich recht, in einen Tell-Block gehört das natürlich nicht.
    Dann brauchst du dich nicht angesprochen fühlen. Das las sich für mich so, als wärst du mit der verlinkten Erklärung nicht einverstanden.

    Was dir allerdings am maskieren von Sonderzeichen nicht gefällt würde mich schon mal interessieren. Hierfür die Verwendung von (als provisorischer Workaround eingeführten) hergeleiteten AS-Konstrukten ("quoted form of POSIX..." et al) zu empfehlen ist sowas von grotesk, dass mir die Worte fehlen. Das habe ich sicher nur missverstanden, oder? Das hast du nicht wirklich gemeint und bist dann trotzdem stehen geblieben, nicht wahr?
     
  8. burning_angel

    burning_angel Golden Delicious

    Dabei seit:
    07.01.08
    Beiträge:
    8
    erstmal vielen dank für euer engagement, aber so richtig werde ich als anfänger nicht aus eurer Diskussion schlau.
    Könntet ihr mir nochmal bitte den "richtigen" Apple Script Code Posten, den ich einsetzen muss, damit die Funktionalität der Befehlsfolge im Terminal bleibt, das aber als Apple Script funktioniert?

    dankeschön und viele grüße
     
  9. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    :eek:
    Code:
    [SIZE="-1"]tell app "Terminal"
        do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
    end tell
    [COLOR="DarkSlateGray"]--alternativ geht auch (bei einem Einzeiler)[/COLOR]
    tell app "Terminal" to do script "find -x \"/Volumes/NO NAME\" -type f -iname '*.jpg' -exec cp -i {} \"/Users/blabla/Desktop/NeuerOrdner/\" \\;"
    [/SIZE]
    Nur eins verstehe ich nicht so ganz...
    Der Befehl wird ein neues Terminal-Fenster aufschlagen und dort die Suche durchführen.
    Gibts irgendeinen besonderen Grund, warum du das alles nicht gleich sowieso dort erledigst?
     
  10. CloneOfMyself

    CloneOfMyself Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    24.02.07
    Beiträge:
    253
    ich gebe littel_pixel schon recht mit der "quoted form". Man denke nur an Dateinamen, die so ziemlich alles enthalten könnten. Und sie berücksichtig eben auch single quotes. Oder wärst Du darauf gekommen und hättest Lust sowas zu maskieren:

    quoted form of "Halli\"Hallö\"Huhu'Haha"
    --> "'Halli\"Hallö\"Huhu'\\''Haha'"

    und wenn der dateiname eben aus variablen kommt und nicht statisch ist, dann hat man eben keine chance selbst alles richtig zu maskieren. da bleibt eigentlich nur quoted form of, da nur diese form alles richtig maskiert.
     
  11. sedna

    sedna Pomme Etrangle

    Dabei seit:
    22.10.08
    Beiträge:
    911
    Hallo! :)

    Da schließe ich mich doch glatt an! Ohne "quoted form of" wäre AS wesentlich aufwändiger, denn wenn man mit Variablen arbeitet, so ist das der einfachste und sicherste Weg (Siehe das Beispielscript von Little Pixel)

    Ausserdem ist das ja nicht eine Erfindung von AS. Wenn ich mal in das hier gepostete shell script schaue, so sehe ich doch schon im dem Original solche quotes :-*

    Wenn man sie richtig einsetzt, sind sie doch genauso sicher wie Maskierungen, oder etwa doch nicht?

    Also @ burning_angel:
    In deinem Fall würde dein Original-Skript nicht ohne die Gänsefüsschen funktionieren, da das Leerzeichen im Pfad nicht maskiert ist.
    Die Frage von Rastafari ist zwar berechtigt, aber Du möchtest dir ja das tippen ersparen. Du merkst aber, dass die Variante, dein Skript in einem AS zu kompilieren, zusätzlichen Aufwand erfordert.
    Um sich "das Tippen zu ersparen", nimmt man deshalb eigentlich einen anderen Weg und erstellt sich ein "ausführbares Skript".

    Man speichert das Skript in einer reinen Textdatei und macht diese mit dem Kommando ausführbar:
    Code:
    chmod +x Pfad/zur/Datei
    Um quotes zu vermeiden :p , ziehe den Pfad ins Terminalfenster

    Sedna
     
  12. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    1) Solche Querulanten sind *immer* ein Problem, egal wo und wie du sie eingeben musst.
    2) Auch in bash gibts sowas wie "gib mich mal die name von...", weisst du?
    3) \"\"Halli\\\"Hallö\\\"Huhu\\'Haha\"\"
    Die Regel ist furchtbar simpel:
    JEDEN Namen für die Shell immer nur in Gänsefüsschen übergeben.
    (Falls nicht schon längst geschehen, ganz normal anfügen)
    Dann vor jeden Backslash und vor jedes Gänsefüsschen einen Backslash, sowie vor einfachen Quotes zwei davon. Und Fertig. So what?

    Und fang jetzt nicht wieder mit den "unüblichen Zeichen" an, sonst nenne ich dir mal Namen die in AS-Befehlen unter keinen Umständen funktionieren (hoffentlich frisst das das Forum...?):
    Das¬ist¬ein@solcher
    Icon^r <--- authentischer Mac OS Name!!
    _kill^n me^g if ^hyou can^r^n
    # Das hier zeigt die Forensoft sonst nicht an,
    # der rote Strich ist ein "Non-breaking Space".
    # Die Caret-Darstellung bezeichnet <CR>,<LF>,<Backspace> bzw <BELL>

    Und weisst du was? Die hab ich noch alle irgendwie kleingekriegt.
    Besonders lustig finde ich übrigens Dateinamen, die bestimmten URL-Schemata entsprechen.
    Da kannst du richtig Gaudi haben mit AS (köstlich!)
    Schön, wenn beim öffnen einer Datei (haha!) plötzlich der Browser aufpoppt...

    Und die Krönung sind Dateinamen, die "rein zufällig" die Bezeichnung des AppleEvents für "kOSAScript:SocketDisconnect" sind. Programmende, finito.
    Vergleichbar etwa einem "kill -SIGTERM" an die bash gesendet, den 32-bit Code dafür weiss ich leider nicht mehr aus dem effeff. AppleScript ist so dämlich, das zu fressen und ein "Signal" an sich selber zu schicken: "Stirb, du... huch, das bin ja ICH!" :)

    Sonst noch absurde Sonderfälle vorzuschlagen?

    Darum bevorzuge ich ja das komplette arbeiten mit Stringvariablen in der Shell.
    Packst'se einfach in " " --> und bingo

    Die Form maskiert nur das was du eingibst.
    Jetzt musst du aber im Skripteditor ja den Text auch schon mit Maskierung eingeben... hmm.
     
  13. CloneOfMyself

    CloneOfMyself Weigelts Zinszahler (Rotfranch)

    Dabei seit:
    24.02.07
    Beiträge:
    253
    Es ist ja jetzt ein wenig OT, aber was soll's. Ich kann deine Aufgeregtheit im Moment auch nicht so ganz nachvollziehen. Es ging ja um die Verbindung zwischen shell und Applescript. Und da ist die quoted form of posix path of ... insbesondere im Umgang mit Dateien einem eigenen Gequote vorzuziehen, zumal, wie bereits gesagt, es bei der Übergabe von Pfaden aus AS-Variablen heraus gar nicht möglich ist, die Maskierung selbst vorzunehmen. Und die quoted form of... ist da eine sehr galante und zuverlässige Methode, die man sich deshalb besser gleich generell innerhalb von Applescript aneignen sollte.
    Nur eines deiner Beispiele:
    set x to choose file
    quoted form of POSIX path of x --> "'/Das¬ist¬ein@solcher'"
    do shell script "mv " & quoted form of (POSIX path of x) & space & "Ein_ganz_normaler_Name"
    Funktioniert tadellos...
     
  14. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Das Zeichen ¬ geht, ja. Aber nicht das was da stand bevor du es per Latin-1 Darstellung im Browser betrachtet hast. Ich kanns leider hier nicht sichtbar machen, habs versucht per SGML-Entity in den Text einzubauen, hat aber leider nicht geklappt. (Forendarstellungen sind halt auch limitiert)

    Wie eine Sprache, die zur Übergabe NUL-terminierte Strings benutzt, ausgerechnet das "canonical decomposite" Unicode-Äquivalent von NUL übertragen können soll, bleibt jedenfalls das Geheimnis von Merlin oder Houdini. Es kann nicht gehen. Die Shell kanns übrigens auch nur mit Extremtricks (literale Anzeige im Terminal ist nicht möglich), aber der Dateiname ist dennoch völlig legal. Apple setzt diesen Trick selbst zwei mal auf deinem Startvolume ein, um zwei essentielle Metadatenordner des Dateisystems vor dir zu verbergen.
    Zeig mir mal, wie du mit deiner Formel die Ordner...
    "/<NUL><NUL><NUL><NUL>HFS+ Private Data"
    "/<NUL><NUL><NUL><NUL>HFS+ Private Directory Data"
    ...sichtbar machst. (Sie sind immer da, auf jedem Volume.)
    Und dann verrate ich dir, wie es mit konventioneller Maskierung eben doch geht. :)
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Die meisten Entwickler wollen indessen keinen Krieg führen, sondern ein Problem lösen.

    Aber hey, scheiß drauf: Wenn es der Brustbehaarung dient, alle irgendwie kleinzukriegen …
     
  16. burning_angel

    burning_angel Golden Delicious

    Dabei seit:
    07.01.08
    Beiträge:
    8
    der grund ist komfort ;)

    kann man eigentlich noch an die befehlsfolge einen befehl dranhägen, so dass das terminal nach erfolgreicher ausfühurng gleich wieder geschlossen wird?
     
  17. Rastafari

    Rastafari Golden Noble

    Dabei seit:
    10.03.05
    Beiträge:
    17.896
    Code:
    tell application "Terminal" to close window 1
    
    -- oder so:
    
    tell app "Terminal"
    [I]  ...bla bla bla[/I]
    [I]  ...bla bla bla[/I]
      close window 1
    end tell
    
     

Diese Seite empfehlen