2012-05-14 2 views
7

In VBScript, è possibile utilizzare determinate classi .net utilizzando l'automazione COM. Questo è utile quando si desidera utilizzare matrici dinamiche, elenchi, code ecc.È possibile ottenere un'istanza di oggetto stringa .Net in VBScript?

Sarebbe bello se potessi usare le stringhe come oggetti, quindi potrei fare all fancy string stuff con esso, ma ogni volta che passo una stringa da un altro oggetto , si è visto da VBScript come una stringa letterale e non come un oggetto stringa:

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 

creando anche una stringa come un oggetto COM non funziona:

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

c'è qualcuno che ha la gestione questo, o ha altri pensieri a riguardo?

+0

Si dovrebbe considerare la possibilità di esaminare PowerShell. –

+3

String come l'oggetto che si conosce da .NET non è disponibile in VBScript. Dovresti ricorrere alle funzioni VBScript standard (len, lcase, ucase, ecc.). –

+2

Non possibile. L'interoperabilità COM incorporata nel CLR lo * convertirà * sempre in un BSTR, il tipo di stringa COM. La chiamata CreateObject non riesce perché System.String non ha un costruttore parametrico. –

risposta

7

È possibile utilizzare alcuni metodi e proprietà, ma non tutti. I seguenti lavori, ma dal momento in cui si utilizza toString si ha una variabile vbscript che si comporta come tale.

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 

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

Ma ad esempio, il seguente non funziona, anche se è un metodo di StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder_methods.aspx non chiedetemi perché

s.Insert 1, "insert this" 

e

s.Insert_2 7, "insert this" 

funziona

Inoltre programma in Ruby dove è possibile utilizzare anche questi oggetti ed eccolo lo stesso comportamento. Per alcuni oggetti posso enumerare le proprietà o metodi come ad esempio per Excel

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

dà una lista molto lunga come

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

Ma non è così per System.Text.StringBuilder, suppongo che è dovuto al il modo in cui il programmatore espone i suoi metodi e proprietà all'esterno.

Purtroppo, non penso sia possibile utilizzare direttamente System.String in vbscript.

+0

Grazie. E so perché 's.Insert (1," insert this ")' non funziona: perché non si pone un'istruzione 'call' davanti ad essa, è vista come una' Sub' e non si può chiamare sottotitoli con parentesi. – AutomatedChaos

+0

hai ragione, la chiamata è stata lasciata fuori con la copia, la parentesi è un'abitudine "cattiva" dal mio codice javascript ma quello che volevo dire è s.Insert 1, "inserisci questo" non funzionerà mai perché non è esposto in il com mentre Insert_2 è e il challegne è come scoprire cosa funziona e cosa non altro allora sperimentando e googling – peter

+0

Io uso molto .net 'system.collections' molto, e non conosco un altro modo per ottenere il corretto numero (o come lo chiami) piuttosto che sperimentarlo o cercarlo su google. La maggior parte delle volte creo una classe wrapper, quindi posso usare nomi di metodi/funzioni più semplici (e introdurre un ulteriore livello di complessità: - \). – AutomatedChaos

0

Hai provato. Msgbox len (s.ToString) o semplicemente MsgBox (s.Length)

In alternativa è possibile creare la propria classe .Net ed esporlo a com che opererebbe come un wrapper per le funzioni di stringa statica si desidera esporre ...

+0

len (s.ToString) funziona ovviamente, perché len è una funzione VBScript standard, ma non è questo il punto. s.Length mi dà la proprietà length di StringBuilder e restituisce 70, quindi è corretto, ma non posso usare i metodi String, come s.ToLower o in realtà s.ToString.ToLower. – AutomatedChaos

+0

Perché hai bisogno di questi metodi quando ci sono funzioni native VBS che fanno la stessa cosa con la stessa facilità. (Come 'LCase') – Nilpo

+1

@Nilpo, solo per soddisfare la mia curiosità. In tal modo, l'oggetto stringa ha alcuni metodi che non sono inclusi nativamente nel set di funzioni VBS (formattazione, riempimento, inserimento, indicizzazione). E mi piace la pratica del concatenamento dei metodi, come 'myArray = myString.Trim(). ToLower(). Split (", ")', è più ordinario di 'myArray = Split (lCase (trim (myString)),", ")' – AutomatedChaos