2012-05-14 11 views
7

En VBScript, puede usar ciertas clases de .NET usando la automatización COM. Esto es útil cuando quieres usar matrices dinámicas, listas, colas, etc.¿Es posible obtener una instancia de objeto de cadena .Net en VBScript?

Sería bueno si pudiera usar cadenas como objetos, entonces podría hacer all fancy string stuff con él, pero cada vez que paso una cadena desde otro objeto , que es visto por VBScript como una cadena literal y no como un objeto de cadena:

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 

también la creación de una cadena como un objeto COM no funcionará:

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

¿hay alguien que maneje esto, o está teniendo otros pensamientos al respecto?

+0

Deberías considerar mirar a powershell. –

+3

Cadena como el objeto que conoce de .NET no está disponible en VBScript. Tendría que recurrir a las funciones estándar de VBScript (len, lcase, ucase, etc.). –

+2

No es posible. La interoperabilidad COM integrada en el CLR * siempre * la convertirá a un BSTR, el tipo de cadena COM. La llamada CreateObject falla porque System.String no tiene un constructor sin parámetros. –

Respuesta

7

Puede usar algunos métodos y propiedades, pero no todos. Lo siguiente funciona, pero desde el momento en que usa toString tiene una variable vbscript que se comporta como tal.

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 

da

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

Pero por ejemplo, el siguiente no funciona, aunque es un método de StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder_methods.aspx no me pregunte por qué

s.Insert 1, "insert this" 

y

s.Insert_2 7, "insert this" 

funciona

También programo en Ruby donde puede utilizar estos objetos también y allí está el mismo comportamiento. Para algunos objetos que puedo enumerar las propiedades o métodos, como por ejemplo para Excel

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

da una lista muy larga como

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

Pero no es así para System.Text.StringBuilder, supongo que se debe a la forma en que el programador expone sus métodos y propiedades al exterior.

Lamentablemente, no creo que sea posible usar System.String directamente en vbscript.

+0

Gracias. Y sé por qué 's.Insert (1," insert this ")' no funciona: como no colocas una declaración 'call' delante, se ve como' Sub' y no puedes llamar subs con paréntesis. – AutomatedChaos

+0

tiene razón, la llamada se dejó con la copia, el paréntesis es un hábito "malo" de mi codificación de JavaScript, pero lo que quería decir es "Insertar 1", "insertar esto" nunca funcionará porque no está expuesto en el com mientras Insert_2 es ​​y el challegne es cómo saber qué funciona y qué no, luego de experimentar y buscar en Google – peter

+0

uso el .net 'system.collections' mucho, y no sé otra manera de obtener el correcto número (o cómo se llama) que solo experimentarlo o buscarlo en Google. La mayoría de las veces creo una clase contenedora, por lo que puedo usar nombres de método/función más fáciles (e introducir una capa adicional de complejidad: - \). – AutomatedChaos

0

Lo has probado. MsgBox len (s.ToString) o simplemente MsgBox (s.length)

Alternativamente, usted puede crear su propia clase .Net y exponerla a com que actuaría como un contenedor para las funciones de cadena estáticos desee exponer ...

+0

len (s.ToString) funciona, por supuesto, porque len es una función VBScript estándar, pero ese no es el punto. La longitud me da la propiedad de longitud de StringBuilder y devuelve 70, por lo que es correcto, pero no puedo usar métodos String, como s.ToLower o en realidad en.String.ToLower. – AutomatedChaos

+0

¿Por qué necesita esos métodos cuando hay funciones VBS nativas que hacen lo mismo con la misma facilidad? (Como 'LCase') – Nilpo

+1

@Nilpo, solo para saciar mi curiosidad. De este modo, el objeto cadena tiene algunos métodos que no se incluyen de forma nativa en el conjunto de funciones VBS (formateo, relleno, inserción, indexación). Y me gusta la práctica de encadenamiento de métodos, como 'myArray = myString.Trim(). ToLower(). Split (", ")', es más nítida que 'myArray = Split (lCase (trim (myString)),", ")' – AutomatedChaos

Cuestiones relacionadas