ฉันสามารถส่งอาร์กิวเมนต์ไปยัง VBScript (ไฟล์ vbs ที่เปิดตัวด้วย cscript) ได้หรือไม่


85

ฉันบันทึกสคริปต์นี้ไว้ใน "test.vbs":

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

เมื่อฉันเรียกใช้สคริปต์ฉันต้องการส่งผ่านค่าของตัวแปร "workFolder"

ฉันจะทำเช่นนี้ได้อย่างไร? ฉันทำมันได้ไหม? บางอย่างเช่น "cscript test.vbs workFolder: 'C: \ temp \'" บางที?

คำถามโบนัส: จำเป็นหรือไม่ที่จะล้างตัวแปรที่ส่งผ่านด้วย "Set workFolder = Nothing" หรือ VBSCript จะทำโดยอัตโนมัติเมื่อสิ้นสุดหรือไม่ บางที "Set File = Nothing" และ "Set FSO = Nothing" ก็ไม่จำเป็น โปรดแจ้งให้เราทราบหากคุณทราบคำตอบของคำถามทั้งสองนี้

คำตอบ:


138

คุณสามารถใช้WScript.Argumentsเพื่อเข้าถึงอาร์กิวเมนต์ที่ส่งไปยังสคริปต์ของคุณ

เรียกสคริปต์:

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

ภายในสคริปต์ของคุณ:

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

อย่าลืมตรวจสอบว่ามีการส่งอาร์กิวเมนต์ไปยังสคริปต์ของคุณจริงหรือไม่ คุณสามารถทำได้โดยตรวจสอบCountคุณสมบัติ:

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

Nothingถ้าสคริปต์ของคุณมีมากกว่าหลังจากที่คุณปิดแฟ้มแล้วไม่มีความจำเป็นต้องตั้งค่าตัวแปรที่จะ ทรัพยากรจะถูกล้างโดยอัตโนมัติเมื่อกระบวนการ cscript.exe สิ้นสุดลง การตั้งค่าตัวแปรเป็นNothingโดยปกติมีความจำเป็นเฉพาะในกรณีที่คุณต้องการเพิ่มทรัพยากรอย่างชัดเจนในระหว่างการเรียกใช้สคริปต์ของคุณ ในกรณีนั้นคุณต้องตั้งค่าตัวแปรที่มีการอ้างอิงถึงวัตถุ COM Nothingซึ่งจะปล่อยวัตถุ COM ก่อนที่สคริปต์ของคุณจะสิ้นสุด นี่เป็นเพียงคำตอบสั้น ๆ สำหรับคำถามโบนัสของคุณคุณจะพบข้อมูลเพิ่มเติมในคำถามที่เกี่ยวข้องเหล่านี้:

จำเป็นต้องตั้งค่า Objects เป็น Nothing inside VBA Functions หรือไม่

ฉันต้องตั้งค่าตัวแปรเป็น“ Nothing” ใน VB6 เมื่อใด


บิงโกแค่นั้นเอง! ชัดเจนมากขอบคุณมาก (คำถามโบนัสยังคงเปิดอยู่ในกรณีที่ใครก็ตามต้องการคำตอบในหนึ่งในความคิดเห็นเหล่านี้)
ปีเตอร์

@Peter: ฉันได้เพิ่มคำตอบสั้น ๆ สำหรับคำถามโบนัสของคุณ
Dirk Vollmar

21

ภายใน VBS คุณสามารถเข้าถึงพารามิเตอร์ด้วยไฟล์

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

และอื่น ๆ จำนวนพารามิเตอร์:

Wscript.Arguments.Count

ขอขอบคุณ! (คำถามโบนัสยังคงเปิดอยู่ในกรณีที่ใครก็ตามต้องการคำตอบในหนึ่งในความคิดเห็นเหล่านี้)
ปีเตอร์

6

แต่ละอาร์กิวเมนต์ที่ส่งผ่านบรรทัดคำสั่งสามารถเข้าถึงได้ด้วย: Wscript.Arguments.Iem (0) โดยที่ศูนย์คือหมายเลขอาร์กิวเมนต์: เช่น 0, 1, 2, 3 เป็นต้น

ดังนั้นในรหัสของคุณคุณสามารถมี:

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 คุณสามารถดักจับข้อผิดพลาดได้ในกรณีที่มีคนไม่ป้อนค่าที่เหมาะสมเป็นต้น

ตัวอย่าง MS Technet


Aha ขอบคุณผู้ชาย น่าสนใจที่คุณไม่ต้องสร้างอินสแตนซ์ของ Wcript (คำถามโบนัสยังคงเปิดอยู่ในกรณีที่ใครก็ตามต้องการคำตอบในหนึ่งในความคิดเห็นเหล่านี้)
ปีเตอร์

1) workFolderไม่ได้กำหนดเป็นวัตถุในคำตอบข้างต้นหรือคำถามเดิมดังนั้นSet workFolder = Nothingควรเพิ่มข้อผิดพลาด 2) เนื่องจากอาร์กิวเมนต์ไม่ได้รับการแนะนำว่าจำเป็นต้องใช้ซ้ำมากกว่าหนึ่งครั้งอาจข้ามการกำหนดให้กับstrFolderตัวแปร 3) ขอแนะนำให้ใช้xแทน0ในWscript.Arguments.Item(0)
user66001

อันที่จริงมันจะไม่ทำให้เกิดข้อผิดพลาดเว้นแต่จะมีการตั้งค่า option อย่างชัดเจนและในกรณีนี้จะไม่มีอะไรทำงานได้เนื่องจากไม่มีการกำหนด นั่นเป็นความจริงเกี่ยวกับตัวแปรอย่างไรก็ตามมันไม่จำเป็นแล้วก็ไม่ได้เป็น FSO หรืออ็อบเจกต์ FILE อีกต่อไปและสามารถใช้แบบง่ายได้ วิธีการต่างๆมากมายที่เป็นไปได้ ... :)
unrealtrip

2

คุณยังสามารถใช้อาร์กิวเมนต์ที่มีชื่อซึ่งเป็นทางเลือกและสามารถกำหนดให้เป็นลำดับใดก็ได้

Set namedArguments = WScript.Arguments.Named

นี่คือฟังก์ชั่นตัวช่วยเล็ก ๆ น้อย ๆ :

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

ตัวอย่าง VBS:

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

ตัวอย่างการใช้งาน:

test.vbs /testArg:123

0

ในการตอบคำถามโบนัสของคุณคำตอบทั่วไปคือไม่คุณไม่จำเป็นต้องตั้งค่าตัวแปรเป็น "Nothing" โดยย่อ. VBS scripts เช่นของคุณซึ่งเรียกโดย Wscript หรือ Cscript

เหตุผลที่คุณอาจทำสิ่งนี้ในช่วงกลางของสคริปต์ที่ยาวขึ้นคือการปล่อยหน่วยความจำกลับไปที่ระบบปฏิบัติการที่ VB ถือไว้ ทุกวันนี้เมื่อ RAM 8GB เป็นปกติและ 16GB + ค่อนข้างธรรมดาสิ่งนี้ไม่น่าจะสร้างผลกระทบใด ๆ ที่วัดได้แม้ในสคริปต์ขนาดใหญ่ที่มีหลายเมกะไบต์ในตัวแปรเดียว ณ จุดนี้มันเป็นการระงับจากวันที่คุณอาจทำงานใน RAM 1MB หรือ 2MB

คุณถูกต้องทันทีที่สคริปต์. VBS ของคุณเสร็จสมบูรณ์ตัวแปรทั้งหมดของคุณจะถูกทำลายและหน่วยความจำจะถูกเรียกคืนอยู่ดี การตั้งค่าตัวแปรเป็น "Nothing" เพียงแค่ทำให้กระบวนการนั้นเร็วขึ้นและช่วยให้คุณสามารถดำเนินการได้ตรงกลางสคริปต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.