Secara Otomatis Pasang Drive Jaringan dan Salin File ke Folder Jaringan (AppleScript)

4

Saya punya tugas yang agak rumit untuk diselesaikan. Saya tidak menggunakan OS X, tetapi sekarang saya harus menyediakan beberapa aplikasi sederhana kepada rekan kerja yang secara otomatis menyalin file tertentu ke folder jaringan. Biasanya saya akan menggunakan skrip shell, tetapi beberapa GUI minimal adalah hal yang harus dimiliki dalam kasus ini. Jadi saya pikir saya bisa menggunakan AppleScript.

Saya harus melakukan langkah-langkah ini:

  1. Sambungkan ke drive jaringan ( smb://myserver/public, di mana setiap pengguna memiliki nama dan kata sandi masuk yang berbeda, jadi menghubungkan nama pengguna dan kata sandi dalam kode bukanlah suatu pilihan).
  2. Arahkan ke folder di drive jaringan (setiap pengguna memiliki folder berbeda di drive jaringan).
  3. Salin file tertentu dari desktop pengguna ke folder yang dibuka di drive jaringan.

Jadi ketika menjalankan skrip, pengguna harus memasukkan nama pengguna dan kata sandi untuk menghubungkan drive jaringan, dan pengguna harus memasukkan nama folder tempat mereka harus menyalin file. Bisakah nama folder disimpan secara permanen entah bagaimana? Jadi pengguna tidak perlu memasukkan nama folder setiap kali ia menjalankan skrip ini. Tetapi dari waktu ke waktu folder ini dapat berubah, jadi harus ada opsi untuk mengubah folder sebelum menyalin. Juga bagaimana saya dapat memeriksa apakah drive jaringan sudah terpasang, sehingga pengguna tidak akan ditanyai nama pengguna dan kata sandi setiap kali dia menjalankan skrip ini?


Berikut ini sejauh mana saya bisa menyusun skrip untuk menyelesaikan tugas ini:

Saya berjuang untuk memahami bagaimana AppleScript suka menyimpan jalur ke file / folder pada drive jaringan yang terpasang.

Jadi inilah yang saya miliki sekarang:

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()
szantaii
sumber
1
Saya berbicara dengan seorang moderator dari SO dan kami berdua ingin menyimpannya di sini sebentar untuk melihat apakah kami dapat memberi Anda jawaban. Saya akan mempromosikan pertanyaan sehingga naik ke puncak antrian kami. Mari kita lihat bagaimana keadaannya dan Anda dipersilakan untuk menandai ini lagi jika Anda benar - benar merasa harus dipindahkan.
bmike
Nah, Anda punya jawaban ... ada yang salah dengan itu Anda merasa perlu untuk SO? Hanya bertanya, saya akan senang untuk memperbaikinya :):
kopischke

Jawaban:

3

Menyalin file dalam Applescript paling baik dilakukan melalui System Events atau Finder , menggunakan duplicate … toperintah, yaitu

tell application "System Events" to duplicate sourceFile to targetFolder

di mana keduanya sourceFiledan targetFolderharus menjadi tipe objek yang benar untuk aplikasi yang digunakan - artinya item disk atau item pencari (kedua objek dapat dibuat dari objek alias AppleScript , atau nilai jalur teks dengan sedikit jenis paksaan - Saya akan menambahkan detailnya, tetapi Anda belum menyatakan bagaimana jalur ke keduanya disimpan / diperoleh dalam skrip Anda).

Beberapa catatan pada kode Anda:

  • Tidak perlu menggunakan global ketika Anda telah mendefinisikannya sebagai properti. Properti AppleScript dibatasi skrip dan bertahan di seluruh eksekusi - mereka hanya direset ketika skrip dikompilasi ulang. Jika Anda menetapkan orang-orang yang memerlukan pengaturan pengguna missing valuesaat menyatakan, Anda bahkan dapat memeriksa apakah mereka sudah mengatur dan melewatkan kembali permintaan pengguna (akan ada solusi yang bahkan lebih nyaman dan aman jika Apple tidak mencabut Skrip Akses Keychain).
  • Tidak perlu untuk pengulangan tugas dan panggilan berulang di connectToServer()handler Anda . Kode berikut

    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 dont hectically loop
        set timeOutCounter to timeOutCounter + someInterval -- time out loop 
    end repeat

    akan mencoba untuk menghubungkan dalam interval yang ditentukan oleh someInterval, sampai mount tersedia atau timeOutIntervaltercapai (dengan asumsi nilai-nilai ini dinyatakan. Sebagai properti, sebaiknya - lihat di atas).

  • Anda mungkin juga ingin menawarkan pengguna Anda cara yang lebih nyaman dalam memilih folder target daripada mengetikkan nama folder dari memori. Lihatlah kamus AppleScript dari Penambahan Standar untuk mengetahui choose folderperintahnya.
  • Akhirnya, tetapi itu terutama masalah selera dan gaya pengkodean, saya lebih suka memindahkan display dialogperintah ke penangannya sendiri dan menyebutnya, jika perlu berulang kali, dari badan skrip, daripada menggunakan mainLooppenangan gaya C. Saya telah menemukan bahwa, secara umum, AppleScript kehabisan ruang Stack dengan mudah ketika berulang dan bisa sangat bingung tentang tugas variabel, jadi itu ide yang baik untuk menghindari konstruksi rekursif di mana mereka tidak diperlukan.
kopischke
sumber
Terima kasih atas jawabannya. Adakah saran untuk mengatur batas waktu? Seberapa sering saya harus memeriksa apakah drive jaringan sudah terpasang? Saya kira delaylangkah-langkah dalam hitungan detik.
szantaii
@szantaii: ya, delaymengukur dalam hitungan detik. Anda harus menguji sedikit pada sistem yang berbeda - Saya sarankan mengatur waktu tunggu Anda menjadi satu setengah kali hingga dua kali waktu koneksi paling lambat yang Anda temui, dan penundaan Anda untuk waktu koneksi tercepat yang Anda temui.
kopischke