Bir VBScript'e (cscript ile başlatılan vbs dosyası) bir bağımsız değişken iletebilir miyim?


85

Bu komut dosyasını "test.vbs" içine kaydetmiştim:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Komut dosyasını çalıştırdığımda "workFolder" değişkeninin değerini iletmek istiyorum.

Bunu nasıl yapabilirim? Bunu yapabilir miyim? "Cscript test.vbs workFolder: 'C: \ temp \'" gibi bir şey olabilir mi?

Bonus soru: Aktarılan değişkeni "Set workFolder = Nothing" ile temizlemek gerekli midir yoksa VBSCript sona erdiğinde bunu otomatik olarak yapar mı? Belki "Set File = Nothing" ve "Set FSO = Nothing" de gereksizdir? Her iki sorunun da cevabını biliyorsanız lütfen bana bildirin.

Yanıtlar:


138

WScript.ArgumentsKomut dosyanıza aktarılan argümanlara erişmek için kullanabilirsiniz .

Komut dosyasını çağırmak:

cscript.exe test.vbs "C:\temp\"

Senaryonuzun içinde:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

Senaryonuza gerçekten bir argüman geçirilip geçirilmediğini kontrol etmeyi unutmayın. CountMülkü kontrol ederek bunu yapabilirsiniz :

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

Dosyayı kapattıktan sonra betiğiniz bittiyse, değişkenleri olarak ayarlamanıza gerek yoktur Nothing. Cscript.exe işlemi sona erdiğinde kaynaklar otomatik olarak temizlenecektir. Bir değişkeni olarak ayarlamak Nothing, yalnızca betiğinizin yürütülmesi sırasında kaynakları açıkça serbest bırakmak istiyorsanız gereklidir. Bu durumda, bir COM nesnesine başvuru içeren değişkenler ayarlarsınız Nothing, bu da COM nesnesini komut dosyanız sona ermeden önce serbest bırakır. Bu, bonus sorunuzun sadece kısa bir cevabıdır, bu ilgili sorularda daha fazla bilgi bulacaksınız:

Nesneleri VBA İşlevleri içinde Hiçbir Şey olarak ayarlamaya ihtiyaç var mı?

VB6'da bir değişkeni ne zaman "Hiçbir Şey" olarak ayarlamalıyım?


Bingo, işte bu! Çok açık, çok teşekkürler. (Bu yorumlardan birinde birisinin cevaplamak istemesi durumunda bonus soru hala açıktır.)
Peter

@Peter: Bonus sorunuza kısa bir cevap ekledim.
Dirk Vollmar

21

VBS'nin içinde parametrelere erişebilirsiniz.

Wscript.Arguments(0)
Wscript.Arguments(1)

ve bunun gibi. Parametre sayısı:

Wscript.Arguments.Count

Teşekkür ederim! (Bu yorumlardan birinde birisinin cevaplamak istemesi durumunda bonus soru hala açıktır.)
Peter

6

Komut satırı aracılığıyla iletilen her argümana şu şekilde erişilebilir: Wscript.Arguments.Item (0) Sıfır, argüman numarasıdır: yani, 0, 1, 2, 3 vb.

Yani kodunuzda şunlar olabilir:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Wscript.arguments.count kullanarak, birinin doğru değeri girmemesi durumunda tuzak hatası yapabilirsiniz.

MS Technet örnekleri


Aha, teşekkürler dostum. Bir Wcript örneği oluşturmanız gerekmemesi ilginç. (Bu yorumlardan birinde birisinin yanıtlamak istemesi durumunda bonus soru hala açıktır.)
Peter

1) workFolderne yukarıdaki cevapta ne de orijinal soruda bir nesne olarak tanımlanmadığından Set workFolder = Nothingbir hata ortaya çıkarması gerekir. 2) Argüman birden fazla kez tekrar kullanılması gerektiği için önerilmediğinden, belki onu strFolderdeğişkene atamayı atlayabilirsiniz . 3) inx0Wscript.Arguments.Item(0)
user66001

Aslında, seçenek açık ayarlanmadıkça bir hata ortaya çıkarmaz ve bu durumda hiçbir şey tanımlanmadığından hiçbir şey çalışmaz. Bu değişken için doğrudur, ancak gerekli değildir, o zaman yine FSO veya FILE nesneleri değildir ve basit bir ile kullanılabilir. Bir ton farklı yaklaşım mümkün ... :)
unrealtrip

2

Ayrıca isteğe bağlı olan ve herhangi bir sırayla verilebilen adlandırılmış bağımsız değişkenleri de kullanabilirsiniz .

Set namedArguments = WScript.Arguments.Named

İşte küçük bir yardımcı işlev:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

Örnek VBS:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

Örnek Kullanım:

test.vbs /testArg:123

0

Bonus sorunuza cevap vermek için, genel cevap hayırdır, değişkenleri kısaca "Hiçbir şey" olarak ayarlamanıza gerek yoktur. Sizinki gibi Wscript veya Cscript tarafından çağrılan VBS betikleri.

Bunu daha uzun bir komut dosyasının ortasında yapabilmenizin nedeni, belleği, aksi takdirde VB'nin elinde tutacağı işletim sistemine geri bırakmaktır. 8GB RAM'in tipik olduğu ve 16GB + 'nın nispeten yaygın olduğu bu günlerde, bunun tek bir değişkende birkaç megabayt bulunan dev bir komut dosyası üzerinde bile ölçülebilir bir etki yaratması olası değildir. Bu noktada, 1MB veya 2MB RAM'de çalışıyor olabileceğiniz günlerden kalma bir tür engel.

Haklısınız, .VBS komut dosyanız tamamlandığı anda, tüm değişkenleriniz yok edilir ve bellek yine de geri alınır. Değişkenleri "Hiçbir Şey" olarak ayarlamak bu işlemi hızlandırır ve bunu bir komut dosyasının ortasında yapmanızı sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.