Netzlaufwerke zuordnen

Ich brauche ein Skript, das Netzlaufwerke basierend auf dem Benutzernamen einer Person zuordnet (wir verwenden AD, um den Zugriff zu ermöglichen). Vor dem 10.10 hat es funktioniert.

Wir haben ein neues Mac-Labor, auf dem 10.12.6 ausgeführt wird. Das alte Skript ist unten.

Ich habe jq von home-brew installiert , erhalte aber immer wieder eine Fehlermeldung, wenn ich versuche, es auszuführen. (Auch unten)

Leider habe ich keine Erfahrung mit AppleScript und völlig verloren.

Jede Hilfe wäre willkommen

# Get Username and Tag Number.  Define the URL for the json request.

set user to do shell script "whoami"
set tag to do shell script "hostname -s"
set link to "https://my.gprc.ab.ca/AppService/api/NetworkMappings?UserName=" & user & "&ComputerName=" & tag
# Get the number of disks currently mounted.

set diskLength to length of (list disks)

# Get number of records in the json object.
# Define the first record number in the object.

set recordLength to do shell script "curl " & quoted form of link & " | jq 'length'"
set recordNumber to 0

# For each json record, determine if the object is a drive or printer and mount/install accordingly.

repeat recordLength times

    # Define a variable pointing to the first record returned by list disks.
    # set diskItem to 1

    try
        set networkPathVar to do shell script "curl " & quoted form of link & " | jq '.[" & recordNumber & "] | .NetworkPath' | cut -c 2- | sed 's:\\\\\\\\\\\\\\\\://:g' | sed 's:\\\\\\\\:/:g'  | sed 's:.$::'"
        set deviceType to do shell script "curl " & quoted form of link & " | jq '.[" & recordNumber & "] | .Type'"
    on error
        return
    end try


    if deviceType contains "Drive" then

        set recordNumber to recordNumber + 1

        # Check to see if the drive is already mounted.  If not mount it.

        # repeat diskLength times
        if networkPathVar does not contain items 1 thru diskLength of (list disks) then

            mount volume "smb:" & networkPathVar

        end if
        # end repeat

    else

        set recordNumber to recordNumber + 1
    end if # End of Device Type IF
end repeat

und der Fehler, den ich bekomme, ist?

sh: jq: command not found
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    36  100    36    0     0    495      0 --:--:-- --:--:-- --:--:--   500
(23) Failed writing body

sh: jq: command not found
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    36  100    36    0     0    495      0 --:--:-- --:--:-- --:--:--   500
(23) Failed writing body (127)
Der PATHan einen Befehl übergebene do shell script Befehl ist /usr/bin:/bin:/usr/sbin:/sbin, und für jede aufgerufene ausführbare Datei, die sich nicht in diesem "PATH" befindet, muss der vollständig qualifizierte Pfadname verwendet werden. Außerdem kann ich Ihren Code nicht testen , aber die Ausgabe , an die übergeben wird, | cut -c 2- | sed 's:\\\\\\\\\\\\\\\\://:g' | sed 's:\\\\\\\\:/:g' | sed 's:.$::'könnte wahrscheinlich durch einen einzigen Befehl ersetzt werden, awkoder die drei geleiteten Befehle sed könnten als ein einziger sed Befehl geschrieben werden -e commandund müssen nicht an zwei zusätzliche Vorkommen von geleitet werden sed.

Antworten (2)

Sie haben wahrscheinlich jqin /usr/local/bin(oder einem anderen Verzeichnis außerhalb von /bin:/sbin:/usr/bin:/usr/sbin) installiert. Normalerweise gehört dieses Verzeichnis nicht dazu, PATHdaher müssen Sie den vollständigen Pfad angeben, um es auszuführen ( /usr/local/bin/jq).

Es tut mir leid, dass Sie mit jemandem sprechen, der sooooo neu bei applyscript ist
Wir alle waren dort. Welchen Teil der Antwort muss ich besser erklären?
@SteveLunney Ersetzen Sie einfach die drei Vorkommen von jq im AppleScript durch /usr/local/bin/jq und es sollte funktionieren. Getestet - soweit ich das ohne richtiges Konto bei gprc.ab.ca bekommen kann.

Das Hauptproblem, auf das hingewiesen wird, ist nicht wirklich ein AppleScript- Problem an sich. Mit anderen Worten, obwohl der do shell script Befehl ein AppleScript- Befehl ist , besteht das Problem darin, dass die vom Befehl aufgerufenen Befehle keine AppleScript- Befehle sind , sondern Befehle und als solche der Umgebung unterliegen, die an übergeben wird, wenn der Befehl ausgeführt wird hingerichtet.do shell script shell shell
do shell script

Der an einen BefehlPATH übergebene ist , und jede aufgerufene ausführbare Datei, die sich nicht darin befindet , muss der vollständig qualifizierte Pfadname verwendet werden.do shell script /usr/bin:/bin:/usr/sbin:/sbinPATH

Die PATH Umgebungsvariable ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen , die Ihre Shell durchsucht, wenn Sie einen Befehl eingeben .

Anscheinend jqist das nicht drin PATH. Mit anderen Worten, jqbefindet sich nicht an einem der folgenden Orte:/usr/bin:/bin:/usr/sbin:/sbin

Ihre Wahlmöglichkeiten sind also entweder Symlink oder Verschieben jq an einen dieser Orte, oder Sie verwenden den vollständig qualifizierten Pfadnamen der jqausführbaren Datei im jq Befehl innerhalb der Befehle des do shell script Befehls .

Wechseln Sie im do shell script Befehljq zu/path/to/jq

Beispiel:/usr/local/bin/jq

Ersetzen Sie die ausführbare Datei /usr/local/bin/durch die tatsächliche ./path/to/jq

Möglicherweise können Sie den Pfad im Terminal mit dem folgenden Befehl ermitteln :

which jq

Auf meinem System which jqist das Ergebnis von:/usr/local/bin/jq

Wenn das nicht funktioniert, verwenden Sie den folgenden Befehl im Terminal :

find / -iname jq 2>/dev/null

Sie müssen AppleScript also wirklich nicht verstehen, da das Problem ein shellProblem ist. Wenn Sie verstehen, wie Muscheln funktionieren, müssen Sie sich auf Ihr mangelndes Verständnis konzentrieren.