AppleScript - Wie setze ich Variablen für eine unbestimmte Anzahl von Listenelementen?

Ich bin neu bei AppleScript. Ich versuche, ein Skript zu erstellen, das die Listenelemente aus einer früheren Automator-Workflow-Aktion nimmt und sie in Variablen umwandelt.

Es wird eine unbestimmte Anzahl von Listenelementen geben (also zwischen 1 und 40 pro Lauf).

Dies funktioniert für eine bestimmte Anzahl von Listenelementen, sagen wir drei.

on run {input, parameters}

    set value of variable "F1" of front workflow to item 1 of input
    set value of variable "F2" of front workflow to item 2 of input
    set value of variable "F3" of front workflow to item 3 of input

    return input
end run

Wenn jedoch nur zwei Listenelemente aus der vorherigen Workflow-Aktion generiert wurden, treten Probleme auf.

Also habe ich das Skript mit aktualisiert, ifum zu versuchen, dieses Problem zu umgehen.

on run {input, parameters}

    if item 1 exists then
        set value of variable "F1" of front workflow to item 1 of input
    end if
    if item 2 exists then
        set value of variable "F2" of front workflow to item 2 of input
    end if
    if item 3 exists then
        set value of variable "F3" of front workflow to item 3 of input
    end if

    return input
end run

Wenn ich dies ausführe, wird nur die erste Variable F1gefüllt. Die anderen bleiben leer/werden nicht ausgefüllt. Ich bin mir nicht sicher, wie ich damit weitermachen soll?

Kann mir jemand sagen, ob ich auf dem richtigen Weg bin oder ob es einen besseren Weg gibt, dies zu tun?

Antworten (1)

Die Variablendeklaration muss vor der Laufzeit erfolgen . Der folgende AppleScript- Beispielcode , der im Skripteditor ausgeführt wird , soll eine Vorgehensweise demonstrieren:

set input to {"one", "two", "three"}

set F1 to missing value
set F2 to missing value
set F3 to missing value
set F4 to missing value

try
    if item 1 of input is not missing value then
        set F1 to item 1 of input
        log "F1 is: " & F1
    end if
    if item 2 of input is not missing value then
        set F2 to item 2 of input
        log "F2 is: " & F2
    end if
    if item 3 of input is not missing value then
        set F3 to item 3 of input
        log "F3 is: " & F3
    end if
    if item 4 of input is not missing value then
        set F4 to item 4 of input
        log "F4 is: " & F4
    end if
end try

log "F4 is still: " & F4

Das Protokollergebnis ist:

(*F1 is: one*)
(*F2 is: two*)
(*F3 is: three*)
(*F4 is still: missing value*)

Offensichtlich wird der log Befehl verwendet, um anzuzeigen, dass den Variablen ein neuer Wert zugewiesen wurde , mit Ausnahme der letzten, da die input listnur drei Elemente enthielt. Sie müssen dies für die Anzahl der benötigten Variablen erstellen, da Sie sie nicht hinzufügen können, nachdem die Ausführung des Codes begonnen hat. Sie haben in Ihrem OP "zwischen 1 und 40 pro Lauf" erwähnt.

Sie würden die log Befehle für den echten Code in jedem der if Anweisungsblöcke entfernen , neben den Variablenzuweisungen , wie es zu diesem Zeitpunkt in der Ausführung des Codes angebracht ist , falls vorhanden.

Beachten Sie, dass durch das Umschließen des Codes der Gruppe von if Anweisungsblöcken , die den neuen Wert der Variablen basierend auf dem Wert von festlegen list item, in einer try Anweisung , wenn weniger itemsin vorhanden sind input list, kein Fehler ausgegeben wird , der die Ausführung von anhalten würde den Code und fährt mit dem restlichen Code fort .

Der Wert der Variablen wird zunächst zugewiesen missing value, es ""können jedoch auch (doppelte Anführungszeichen) verwendet werden. Ich verwende missing valuemanchmal gerne , da es einfacher sein kann, den Code zu lesen .

HINWEIS: Der Beispiel- AppleScript- Code darüber ist genau das und ist so codiert, wie er ist, um eine Möglichkeit zu demonstrieren, den Variablen einen Wert aus einer Liste zuzuweisen . Dies ist inputbeispielsweise im Zusammenhang mit on run {input, parameters}einer Run AppleScript- Aktion in einem Automator- Workflow der Fall . Je nachdem, was die Quelle des inputist und was damit gemacht wird, müssen Sie ggf. eg as stringoder as textoder andere Zwängeitem n of input hinzufügen, in diesem Fall nach , zB set F1 to item 1 of input as string.