2012-05-14 39 views
7

Trong VBScript, bạn có thể sử dụng các lớp .net nhất định bằng cách sử dụng tự động hóa COM. Điều này có ích khi bạn muốn sử dụng mảng động, danh sách, hàng đợi, vvCó thể lấy một đối tượng chuỗi .Net trong VBScript không?

Sẽ tốt hơn nếu tôi có thể sử dụng chuỗi làm đối tượng, vì vậy tôi có thể làm all fancy string stuff với nó, nhưng bất cứ khi nào tôi chuyển chuỗi từ một đối tượng khác , nó được xem bởi VBScript như một chuỗi chữ và không phải là một đối tượng chuỗi:

Set s = CreateObject("System.Text.StringBuilder") 
s.Append_3 "I love deadlines. I like the whooshing sound they make as they fly by." 

' This gives me the literal string 
MsgBox s.ToString 
text = s.ToString 

' But unfortunately this won't work 
MsgBox s.ToString.Length 
Set stringRef = s.ToString 

Ngoài việc tạo ra một chuỗi như một đối tượng COM sẽ không làm việc:

Set s = CreateObject("System.String")  ' Nope. 

có ai đó đã làm quản lý điều này, hoặc đang có những suy nghĩ khác về nó?

+0

Bạn nên cân nhắc xem PowerShell. –

+3

String là đối tượng bạn biết từ .NET không có sẵn trong VBScript. Bạn sẽ phải sử dụng các hàm VBScript chuẩn (len, lcase, ucase, v.v.). –

+2

Không thể. COM interop được tích hợp vào CLR sẽ luôn * chuyển đổi nó thành BSTR, kiểu chuỗi COM. Cuộc gọi CreateObject không thành công vì System.String không có hàm tạo tham số-ít. –

Trả lời

7

Bạn có thể sử dụng một số phương pháp và thuộc tính, không phải tất cả chúng. Các công trình sau đây, nhưng từ thời điểm bạn sử dụng toString bạn có một biến VBScript hoạt động như vậy.

Set s = CreateObject("System.Text.StringBuilder") 
s.Append_3 "I love deadlines. I like the whooshing sound they make as they fly by." 
s.Append_3 "and the rest." 
wscript.echo s.Length 
wscript.echo s.Capacity 
wscript.echo chr(s.chars(0)) 
wscript.echo s.Replace("t", "d").Replace("l", "k").toString 

cho

83 
140 
I 
I kove deadkines. I kike dhe whooshing sound dhey make as dhey fky by.and dhe resd. 

Nhưng ví dụ sau đây không làm việc, mặc dù nó là một phương pháp StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder_methods.aspx đừng hỏi tôi tại sao

s.Insert 1, "insert this" 

s.Insert_2 7, "insert this" 

không hoạt động

Tôi cũng lập trình trong Ruby nơi bạn có thể sử dụng các đối tượng này và cũng có hành vi tương tự. Đối với một số đối tượng tôi có thể liệt kê các thuộc tính hoặc các phương pháp như ví dụ cho Excel

require 'win32ole' 
excel = WIN32OLE.new('Excel.Application') 
properties = excel.ole_get_methods 
properties.each do |property| 
    p property.to_s 
end 

đưa ra một danh sách rất dài như

"Application" 
"Creator" 
"Parent" 
"ActiveCell" 
"ActiveChart" 
"ActiveDialog" 
"ActiveMenuBar" 
"ActivePrinter" 
"ActiveSheet" 
"ActiveWindow" 
"ActiveWorkbook" 
etc etc 

Nhưng không phải như vậy vì System.Text.StringBuilder, tôi cho rằng đó là do cách lập trình cho thấy phương pháp và thuộc tính của anh ta ở bên ngoài.

Đáng buồn thay, tôi không nghĩ rằng có thể trực tiếp sử dụng System.String trong vbscript.

+0

Cảm ơn. Và tôi biết tại sao 's.Insert (1," insert this ")' không hoạt động: Bởi vì bạn không đặt câu lệnh 'call' ở trước nó, nó được xem như là' Sub' và bạn không thể gọi subs với dấu ngoặc đơn. – AutomatedChaos

+0

bạn nói đúng, cuộc gọi bị bỏ lại với việc sao chép, dấu ngoặc đơn là một thói quen "xấu" từ mã javascript của tôi nhưng những gì tôi muốn nói là s.Insert 1, "insert this" sẽ không bao giờ hoạt động vì nó không được hiển thị com trong khi Insert_2 là và sugggne là làm thế nào để tìm hiểu những gì làm việc và những gì không khác sau đó bằng cách thử nghiệm và googling – peter

+0

Tôi sử dụng. net 'system.collections' rất nhiều, và tôi không biết một cách khác để có được chính xác số (hoặc làm thế nào để bạn gọi nó) hơn là chỉ thử nghiệm hoặc googling nó. Hầu hết thời gian tôi tạo một lớp bao bọc, vì vậy tôi có thể sử dụng các tên hàm/phương thức dễ dàng hơn (và giới thiệu thêm một lớp phức tạp: - \). – AutomatedChaos

0

Bạn đã thử. Msgbox len (s.ToString) hoặc chỉ đơn giản là MsgBox (s.Length)

Hoặc bạn có thể tạo lớp .Net của riêng bạn và hiển thị nó với com, hoạt động như một trình bao bọc cho các hàm chuỗi tĩnh bạn muốn trưng ra ...

+0

len (s.ToString) hoạt động của khóa học, bởi vì len là một hàm VBScript chuẩn, nhưng đó không phải là vấn đề. s.Length mang lại cho tôi thuộc tính length của StringBuilder và trả về 70, vì vậy đó là chính xác, nhưng tôi không thể sử dụng các phương thức String, như s.ToLower hoặc thực sự s.ToString.ToLower. – AutomatedChaos

+0

Tại sao bạn cần những phương pháp đó khi có các hàm VBS gốc làm cùng một điều dễ dàng. (Chẳng hạn như 'LCase') – Nilpo

+1

@Nilpo, chỉ để làm giảm sự tò mò của tôi. Qua đó, đối tượng chuỗi có một số phương thức không có trong bộ chức năng VBS (định dạng, đệm, chèn, lập chỉ mục). Và tôi thích thực hành phương pháp chuỗi, như 'myArray = myString.Trim(). ToLower(). Split (", ")', nó là neater hơn 'myArray = Split (lCase (trim (myString)),", ")' – AutomatedChaos

Các vấn đề liên quan