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:
- 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). - Arahkan ke folder di drive jaringan (setiap pengguna memiliki folder berbeda di drive jaringan).
- 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()
sumber
Jawaban:
Menyalin file dalam Applescript paling baik dilakukan melalui System Events atau Finder , menggunakan
duplicate … to
perintah, yaitudi mana keduanya
sourceFile
dantargetFolder
harus 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:
missing value
saat 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 berikutakan mencoba untuk menghubungkan dalam interval yang ditentukan oleh
someInterval
, sampai mount tersedia atautimeOutInterval
tercapai (dengan asumsi nilai-nilai ini dinyatakan. Sebagai properti, sebaiknya - lihat di atas).choose folder
perintahnya.display dialog
perintah ke penangannya sendiri dan menyebutnya, jika perlu berulang kali, dari badan skrip, daripada menggunakanmainLoop
penangan 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.sumber
delay
langkah-langkah dalam hitungan detik.delay
mengukur 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.