Montare automaticamente un'unità di rete e copiare un file in una cartella di rete (AppleScript)

4

Ho un compito piuttosto complesso da risolvere. Non utilizzo OS X, ma ora devo fornire ad alcuni colleghi una semplice applicazione che copia automaticamente un determinato file in una cartella di rete. Normalmente userei uno script di shell, ma in questo caso alcune interfacce grafiche minimali sono una cosa assolutamente da avere. Quindi pensavo di poter usare AppleScript.

Dovrei eseguire questi passaggi:

  1. Connessione a un'unità di rete ( smb://myserver/public , in cui ogni utente ha nomi di accesso e password diversi, quindi il cablaggio dei nomi utente e delle password nel codice non è un'opzione).
  2. Passare a una cartella sull'unità di rete (ogni utente ha una cartella diversa sull'unità di rete).
  3. Copia un determinato file dal desktop dell'utente nella cartella aperta sull'unità di rete.

Quindi, quando si esegue lo script, l'utente deve inserire il proprio nome utente e password per connettere l'unità di rete e l'utente deve inserire il nome della cartella in cui copiare il file. Il nome della cartella può essere memorizzato in modo permanente in qualche modo? Quindi l'utente non dovrà inserire il nome della cartella ogni volta che esegue questo script. Ma di tanto in tanto queste cartelle possono cambiare, quindi ci deve essere un'opzione per cambiare la cartella prima di copiare. Inoltre, come posso verificare se l'unità di rete è già montata, quindi all'utente non verrà richiesto nome utente e password ogni volta che esegue questo script?

Ecco fino a che punto sono riuscito ad assemblare uno script per svolgere questo compito:

Non riesco a capire come AppleScript voglia memorizzare un percorso su un file / cartella su un'unità di rete montata.

Quindi ecco cosa ho ora:

property userName : "myfolder"
property folderName : "myusername"

property serverName : "public"
property serverAddress : "smb://myserver/public"
property serverStatus : 0

on connectToServer()
    global userName
    global folderName
    global serverName
    global serverAddress
    global serverStatus

    set mountedDisks to list disks
    if mountedDisks does not contain serverName then
        mount volume serverAddress as user name userName with password (display dialog "Enter password for" & quoted form of serverName with title "" default answer "" giving up after 3 with hidden answer)
    end if

    set mountedDisks to list disks
    if mountedDisks contains serverName then
        set serverStatus to 1
    else
        connectToServer()
    end if
end connectToServer

on mainLoop()
    global userName
    global folderName
    global serverName
    global serverAddress
    global serverStatus

    if serverStatus is equal to 0 then
        connectToServer()
    end if

    set mainDialog to display dialog ¬
        "Your username: " & userName & "
Your folder's name: " & folderName buttons {"Quit", "Settings", "Copy file"} with title "File Copier" default button 1
    set mainDialogAnswer to button returned of mainDialog

    if mainDialogAnswer is equal to "Quit" then
        quit
    end if

    if mainDialogAnswer is equal to "Settings" then
        display dialog "Enter your username" with title "Step 1 of 2" default answer userName
        set userName to {text returned of result}

        display dialog "Enter your folder's name" with title "Step 2 of 2" default answer folderName
        set folderName to {text returned of result}

        mainLoop()
    end if

    if mainDialogAnswer is equal to "Copy" then
        -- copy the file
    end if
end mainLoop

mainLoop()
    
posta szantaii 04.05.2012 - 08:48
fonte

1 risposta

3

La copia dei file in Applescript può essere eseguita in modo ottimale tramite Eventi di sistema o Finder , usando il comando duplicate … to , cioè

tell application "System Events" to duplicate sourceFile to targetFolder

dove sia sourceFile che targetFolder devono essere il tipo di oggetto corretto per l'applicazione utilizzata - ovvero elemento disco o elemento finder (entrambi gli oggetti possono essere creati dagli oggetti alias di AppleScript o dai valori del percorso testuale con un po 'di tipo coercizione: aggiungerei i dettagli, ma non hai specificato in che modo i percorsi di entrambi vengono memorizzati / acquisiti nello script).

Alcune note sul tuo codice:

  • Non è necessario utilizzare i globali quando li hai già definiti come proprietà. Le proprietà di AppleScript sono scope scope e persistono attraverso l'esecuzione - vengono resettate solo quando lo script viene ricompilato. Se assegni quelli che hanno bisogno dell'impostazione utente missing value quando dichiari, puoi anche controllare se sono già impostati e saltare nuovamente l'utente (ci sarebbe una soluzione ancora più comoda e sicura se Apple non avesse deprecato Keychain Access Scripting ).
  • Non sono necessari i ripetuti assegnamenti e le chiamate ricorsive nel tuo connectToServer() handler. Il seguente codice

    set timeOutCounter to 0
    repeat while (list disks) does not contain serverName and timeOutCounter is less than timeOutInterval
        -- mount drive
        delay someInterval -- recommended, so you don’t hectically loop
        set timeOutCounter to timeOutCounter + someInterval -- time out loop 
    end repeat
    

    proverà a connettersi nell'intervallo definito da someInterval , fino a quando il mount è disponibile o timeOutInterval viene raggiunto (supponendo che questi valori siano dichiarati. Come proprietà, meglio - vedi sopra).

  • Si potrebbe anche voler offrire all'utente un modo più comodo di selezionare la cartella di destinazione rispetto alla digitazione di un nome di cartella dalla memoria. Consulta il dizionario AppleScript di Aggiunte standard per il comando choose folder .
  • Infine, ma è principalmente una questione di gusto e stile di codifica, preferisco spostare il comando display dialog nel proprio gestore e chiamare, se necessario più volte, dal corpo dello script, piuttosto che usare uno stile C mainLoop gestore. Ho scoperto che, in generale, AppleScript esaurisce lo spazio Stack facilmente durante la ricorsione e può diventare molto confuso riguardo alle assegnazioni di variabili, quindi è una buona idea evitare costrutti ricorsivi laddove non sono necessari.
risposta data 04.05.2012 - 16:20
fonte

Leggi altre domande sui tag