Saturday 9 January 2016

Getting - or Creating - an Object

Mendapatkan - atau Membuat - Obyek
Misteri alam semesta yang tampaknya tak ada habisnya. Bagaimana piramida besar dari Mesir diciptakan? Di mana lingkaran tanaman benar-benar datang dari? Berapa banyak menjilat yang dibutuhkan untuk sampai ke pusat Tootsie Roll sebuah Tootsie Pop? Salah satu misteri besar scripting adalah bagaimana referensi objek diciptakan. Apakah kita menggunakan GetObject vs CreateObject? Apa perbedaan antara keduanya? Ada banyak hipotesis sekitarnya ini lainnya, non-scripting, misteri (misalnya, banyak orang berpikir bahwa mereka telah memecahkan misteri Tootsie Pop), tapi hari ini kami benar-benar akan menjelaskan scripting misteri besar, dan kebenaran akan terungkap.


Sebelum kita melangkah lebih jauh, kita harus memperingatkan Anda bahwa, karena ini adalah Sesame Script, Anda mungkin mengharapkan informasi untuk pemula. Namun, artikel khusus ini adalah pertama melihat beberapa konsep yang sedikit lebih maju. Misalnya, sebelum Anda dapat mulai memahami bagaimana untuk membuat referensi objek, Anda perlu memahami apa referensi obyek adalah. Tapi jangan khawatir, kami berbicara tentang itu dalam artikel lain, "Class di Sesi," sehingga Anda dapat pergi membaca artikel yang pertama kemudian datang kembali ke sini untuk grand pembukaan. Jangan khawatir, kita akan tinggal di sini dan menunggu untuk Anda.

Empat Kreator Obyek

Ada empat metode yang tersedia untuk menciptakan referensi objek: CreateObject, GetObject, CreateObject, dan GetObject. Tidak, itu bukan kesalahan. (The Scripting Pria membuat kesalahan Jangan Nah, oke, kadang-kadang -?! Tapi tidak dalam kasus ini.) Itu benar-benar adalah empat metode, dan bukan hanya dua metode diulang. Dua metode ini metode VBScript dan dua adalah Windows Script Host (WSH) metode:


VBScript
CreateObject(servername.typename [, location])
GetObject([pathname] [, class])
WSH
object.CreateObject(strProgID[,strPrefix])
object.GetObject(strPathname [,strProgID], [strPrefix])

Sekarang, Anda bisa bekerja keras melalui VBScript dan WSH Bahasa Referensi dan susah payah mencoba untuk mencari tahu bagaimana menggunakan metode ini. Atau Anda bisa terus membaca dan kami akan menjelaskan semuanya Anda benar-benar perlu tahu untuk membedakan antara semua ini. (Jika Anda masih ingin memahami apa yang terjadi di Referensi Bahasa, baca "Cara Membaca SDK.") 

CreateObject vs GetObject
Kita akan berbicara lebih rinci nanti tentang perbedaan antara VBScript dan versi WSH benda-benda. Untuk saat ini, kita akan fokus pada versi VBScript, karena itulah yang Anda akan menggunakan sebagian besar waktu. Apa yang paling penting di sini adalah untuk memahami perbedaan antara CreateObject dan GetObject, dan mengapa Anda kadang-kadang perlu menggunakan satu dan kadang-kadang yang lain.
Bagian atas halaman
VBScript CreateObject
Anda menggunakan CreateObject ketika Anda ingin membuat contoh baru dari sebuah objek. Sebagai contoh, jika Anda ingin memulai sebuah contoh baru dari Excel, Anda akan membuat sebuah referensi obyek seperti ini:

 
Set objExcel = CreateObject("Excel.Application")



Anda sekarang memiliki referensi obyek ke sebuah contoh dari Excel, dan Anda dapat menggunakan referensi objek untuk memanggil metode dan properti yang akan memanipulasi Excel. Hanya untuk membuktikan itu, berikut adalah script yang menggunakan CreateObject untuk membuat sebuah instance dari Excel, kemudian menggunakan objek yang membuat Excel terlihat di layar dan menambahkan buku kerja baru:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Berikut adalah script yang menciptakan dua contoh yang terpisah dari Excel:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = CreateObject("Excel.Application")
objExcel2.Visible = True
Set objWorkbook = objExcel2.Workbooks.Add 
 
Jalankan script ini dan Anda akan melihat dua contoh Excel terbuka pada desktop Anda. Anda dapat mengontrol masing-masing secara terpisah dalam naskah Anda berdasarkan variabel yang kita digunakan untuk menyimpan objek referensi: objExcel dan objExcel 2.
VBScript GetObject

Sekarang kita tahu bahwa kita dapat membuat obyek dengan memanggil CreateObject, mengapa kita perlu menggunakan GetObject? Bisakah kita menggunakannya di tempat CreateObject?

Set objExcel = GetObject("Excel.Application")
objExcel.Visible = True
 
Jika Anda mencoba menjalankan script ini, Anda akan menemukan bahwa jawabannya tidak, Anda tidak bisa hanya menggunakan GetObject di tempat CreateObject. Anda akan tahu ini adalah jawabannya ketika Anda menerima kesalahan "sintaks tidak valid." Itu petunjuk yang cukup baik.

Tujuan dari GetObject adalah untuk mengambil referensi ke objek yang sudah berjalan. Jadi Anda mungkin berpikir bahwa jika Anda dapat membuat referensi obyek ke Excel dengan menelepon CreateObject maka Anda dapat membuat referensi obyek lain untuk bahwa contoh yang sama dari Excel dengan memanggil GetObject, seperti ini:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = GetObject("Excel.Application") 
 
Nah, hampir. Kode yang tidak bekerja, tetapi Anda akan menemukan bahwa ini tidak:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add

Set objExcel2 = GetObject(, "Excel.Application")
Set objWorkbook = objExcel2.Workbooks(1)
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel2.Cells(1, 1).Value = 11

Anda akan melihat bahwa kami melewatkan parameter pertama dan hanya digunakan parameter kedua untuk merujuk Excel.Application. Selain itu, masih tampaknya bekerja banyak seperti CreateObject, dan sama seperti kita harapkan. Jadi apa masalahnya? Sebenarnya, ada beberapa masalah. Sebagai permulaan, kita tidak bisa datang dengan alasan yang baik mengapa Anda akan melakukan hal ini. Anda sudah memiliki referensi obyek ke Excel, mengapa Anda membutuhkan satu sama lain? Dan bahkan jika Anda tidak ingin lagi, daripada menggunakan GetObject Anda dapat hanya melakukan ini:

Set objExcel2 = objExcel
 
Sekarang Anda memiliki dua variabel yang referensi objek yang sama, dan Anda tidak perlu memanggil metode sama sekali. Dan, benar-benar, pilihan kedua ini lebih baik pula karena setidaknya Anda tahu mana contoh Excel yang akan Anda mendapatkan. Misalkan Anda memiliki tiga contoh berjalan Excel dan Anda menjalankan script ini:

Set objExcel2 = GetObject(, "Excel.Application")
Set objWorkbook = objExcel2.Workbooks(1)
Set objWorksheet = objWorkbook.Worksheets(1)
objExcel2.Cells(1, 1).Value = 11 
 
Manakah contoh Excel yang telah kamu ubah? Tidak ada cara untuk mengetahuinya.

Jadi mari kita membuat hidup kita sederhana, menghindari banyak sakit kepala, dan mengatakan bahwa, dalam semua kecuali kasus yang paling ekstrim, menggunakan CreateObject untuk membuat referensi objek. Kecuali…

Ya, selalu ada pengecualian. Pengecualian utama adalah Windows Management Instrumentation (WMI) dan antarmuka layanan direktori aktif (ADSI). Kami akan fokus pada WMI sini, tetapi segala sesuatu yang kita katakan juga benar dari ADSI.

Perbedaan utama antara cara WMI bekerja dan cara aplikasi seperti Excel bekerja adalah bahwa WMI selalu berjalan. Bahkan jika Anda menghentikan layanan WMI, segera setelah Anda mencoba untuk mengaksesnya, maka secara otomatis akan mulai lagi. Jadi jika komputer aktif, objek WMI tersedia. Untuk itu, Anda tidak perlu membuat objek, mereka sudah ada. Anda hanya harus mendapatkan mereka - dengan GetObject.

Berikut contoh penggunaan GetObject untuk mengambil referensi ke objek WMI:
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Parameter kami lolos ke GetObject benar-benar terdiri dari tiga bagian: winmgmts (moniker untuk SWbemServices objek, yang merupakan layanan WMI), nama komputer kita mengakses (. Titik mewakili komputer lokal), dan namespace dalam WMI Anda ingin mengakses (dalam hal ini root \ CIMV2). Untuk alasan ini, di sebagian besar script Anda akan melihat panggilan yang dibuat seperti ini:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 
Memisahkan nama komputer ke dalam variabel memungkinkan Anda untuk dengan mudah mengubah nama komputer Anda mengakses.

Ya, kita tahu, ini semakin membingungkan dari menit ke menit. Layanan WMI, namespace ... apa semua ini? Nah, Anda mungkin tahu apa layanan adalah. Ada layanan Alerter, layanan Event Log, layanan Messenger, dan sebagainya. Dan tentu saja ada juga layanan WMI. Namespaces hanya dari cara mengorganisasikan objek. Kebanyakan WMI objek yang akan Anda gunakan akan di root \ CIMV2 namespace.
Catatan: Untuk melihat ruang nama yang berbeda dan objek yang berbeda terkait dengan mereka, men-download Scriptomatic.

Mengambil Informasi dari Layanan WMI


Sekarang bahwa kita memiliki referensi ke layanan WMI kita bisa query untuk objek tertentu WMI kita cari dengan menelepon baik dengan metode Dapatkan atau metode ExecQuery pada layanan (objek yang SWbemServices). Berikut ini adalah contoh yang menggunakan metode Dapatkan untuk mengembalikan referensi objek ke objek Win32_LogicalDisk dengan Device ID dari C ::

 

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objLogicalDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='c:'")
Jika Anda ingin mengambil koleksi benda-benda, atau mengambil benda berdasarkan beberapa kriteria, Anda menggunakan ExecQuery. Berikut ini adalah contoh yang, sekali lagi, menggunakan objek Win32_LogicalDisk, tetapi dalam kasus ini kita ingin semua benda Win32_LogicalDisk:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colDrives = objWMIService.ExecQuery _
    ("Select * From Win32_LogicalDisk")

For Each objDrive in colDrives
    Wscript.Echo "Drive letter: " & objDrive.DeviceID
    Wscript.Echo "Network path: " & objDrive.ProviderName
Next
 
 
Jika kita telah menggunakan metode Get dalam hal ini daripada ExecQuery, Get mengembalikan drive jaringan pertama ditemui dan mengembalikan referensi objek untuk drive itu. Jika Anda memiliki lebih dari satu drive jaringan Anda tidak memiliki cara untuk mengetahui yang akan dikembalikan. Dengan menggunakan ExecQuery, Anda kembali semuanya. (Untuk membaca rincian tentang bagaimana sisa script ini bekerja, lihat artikel Hei, Scripting Guy! Ini.)

VBScript vs. WSH

Kami tidak akan berbicara banyak tentang perbedaan antara metode VBScript dan metode WSH yang identik-bernama karena seperti yang telah disebutkan, sebagian besar waktu Anda akan menggunakan metode VBScript seperti kami hanya menunjukkan Anda.

Set objExcel = Wscript.CreateObject("Excel.Application")
 
Satu perbedaan yang jelas antara keduanya adalah bahwa jika Anda menggunakan versi WSH baik yang CreateObject atau metode GetObject Anda perlu mendahului nama metode dengan Wscript, seperti ini:

Set objExcel = CreateObject("Excel.Application", "atl-ws-01")
Set objExcel = Wscript.CreateObject("Excel.Application", "Sub")
Anda mungkin telah memperhatikan bahwa segala sesuatu yang lain dalam pernyataan ini tampak persis seperti versi VBScript. Yang mengejutkan adalah bahwa ia bekerja persis sama, juga. Perbedaannya hanya menjadi jelas ketika Anda memutuskan untuk menggunakan parameter kedua:
Contoh pertama menggunakan metode VBScript CreateObject. Parameter kedua menunjuk nama mesin terhadap yang Anda ingin menjalankan script. Contoh kedua adalah versi WSH, dan parameter kedua adalah awalan subrutin. Kami tidak akan pergi ke detail tentang semua ini karena parameter ini tidak selalu berperilaku seperti yang diharapkan, dan Anda akan jarang menggunakannya. Begitu saja kita tidak bisa memikirkan sangat banyak contoh dari ribuan script pada Script Center yang memerlukan penggunaan parameter tambahan ini. (Meskipun Tales dari kolom Script saya akan Get Anda My Cukup .... Dan Kami akan Mengelola Windows Update, Terlalu! Tidak membahas bagaimana Anda dapat menggunakan VBScript parameter kedua untuk mengelola layanan Windows Update pada komputer remote.)
Informasi lebih
WSH - Using COM Objects
VBScript - Connecting to Objects
Eric Lippert’s Blog - What’s the Difference between Wscript.CreateObject, Server.CreateObject, and CreateObject?

Misteri Terpecahkan

Kita tahu bahwa adalah sedikit membingungkan, dan itu semacam versi bertele-tele ini: Gunakan GetObject untuk WMI dan ADSI, pengguna CreateObject untuk hanya tentang segala sesuatu yang lain.
Seperti kebanyakan aturan ada pengecualian, tapi mereka sedikit dan jauh antara. Sekarang mungkin kita akan mulai bekerja pada mereka Tootsie Pops.

   

 https://technet.microsoft.com/library/ee176980.aspx

No comments:

Post a Comment