Tôi có thể chuyển đối số vào VBScript (tệp vbs được khởi chạy bằng cscript) không?


85

Tôi đã lưu tập lệnh này trong "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

Khi tôi chạy tập lệnh, tôi muốn chuyển giá trị của biến "workFolder".

Tôi có thể làm cái này như thế nào? Tôi có thể làm được không? Có lẽ như "cscript test.vbs workFolder: 'C: \ temp \'"?

Câu hỏi bổ sung: Có cần thiết phải làm sạch biến đã truyền bằng "Set workFolder = Nothing" hay VBSCript làm điều đó tự động khi nó kết thúc không? Có lẽ "Set File = Nothing" và "Set FSO = Nothing" cũng không cần thiết? Vui lòng cho tôi biết nếu bạn biết câu trả lời cho cả hai câu hỏi này.

Câu trả lời:


138

Bạn có thể sử dụng WScript.Argumentsđể truy cập các đối số được truyền vào tập lệnh của mình.

Gọi tập lệnh:

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

Bên trong tập lệnh của bạn:

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

Đừng quên kiểm tra xem đã thực sự có một đối số nào được chuyển đến tập lệnh của bạn chưa. Bạn có thể làm như vậy bằng cách kiểm tra thuộc Counttính:

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

Nếu tập lệnh của bạn hết sau khi bạn đóng tệp thì không cần đặt các biến thành Nothing. Các tài nguyên sẽ tự động được dọn dẹp khi quá trình cscript.exe kết thúc. Đặt một biến thành Nothingthường chỉ cần thiết nếu bạn muốn giải phóng tài nguyên một cách rõ ràng trong quá trình thực thi tập lệnh của mình. Trong trường hợp đó, bạn sẽ đặt các biến có chứa tham chiếu đến đối tượng COM Nothing, sẽ giải phóng đối tượng COM trước khi tập lệnh của bạn kết thúc. Đây chỉ là một câu trả lời ngắn gọn cho câu hỏi tiền thưởng của bạn, bạn sẽ tìm thấy thêm thông tin trong các câu hỏi liên quan sau:

Có cần đặt Đối tượng thành Không có gì bên trong Hàm VBA không

Khi nào tôi phải đặt một biến thành “Không có gì” trong VB6?


Bingo, đó là nó! Rất rõ ràng, cảm ơn rất nhiều. (Câu hỏi tiền thưởng là vẫn mở trong trường hợp có ai muốn trả lời nó trong một trong các ý kiến.)
Peter

@Peter: Tôi đã thêm một câu trả lời ngắn cho câu hỏi thưởng của bạn.
Dirk Vollmar

21

Bên trong VBS, bạn có thể truy cập các thông số với

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

và như thế. Số lượng tham số:

Wscript.Arguments.Count

Cảm ơn bạn! (Câu hỏi tiền thưởng là vẫn mở trong trường hợp có ai muốn trả lời nó trong một trong các ý kiến.)
Peter

6

Mỗi đối số được truyền qua dòng lệnh có thể được truy cập bằng: Wscript.Arguments.Item (0) Trong đó số 0 là số đối số: tức là, 0, 1, 2, 3, v.v.

Vì vậy, trong mã của bạn, bạn có thể có:

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

Sử dụng wscript.arguments.count, bạn có thể mắc lỗi trong trường hợp ai đó không nhập giá trị thích hợp, v.v.

Ví dụ về MS Technet


Aha, cảm ơn anh bạn. Điều thú vị là bạn không phải tạo một phiên bản của Wcript. (Câu hỏi thưởng vẫn còn mở trong trường hợp có ai muốn trả lời nó bằng một trong những nhận xét này.)
Peter

1) workFolderkhông được xác định là một đối tượng trong câu trả lời ở trên, hoặc câu hỏi ban đầu, vì vậy Set workFolder = Nothingsẽ phát sinh lỗi. 2) Vì Đối số không được đề xuất là cần được sử dụng lại nhiều lần, có thể bỏ qua việc gán nó cho strFolderbiến. 3) Sẽ đề xuất sử dụng xthay vì 0trongWscript.Arguments.Item(0)
user66001

Trên thực tế, nó sẽ không gây ra lỗi trừ khi tùy chọn rõ ràng được đặt và trong trường hợp đó sẽ không có gì hoạt động vì không có gì được xác định. Điều đó đúng về biến tuy nhiên, nó không cần thiết, sau đó một lần nữa không phải đối tượng FSO hoặc FILE và có thể sử dụng một đơn giản với. Có thể có rất nhiều cách tiếp cận khác nhau ... :)
chưa thực hiện

2

Bạn cũng có thể sử dụng các đối số được đặt tên là tùy chọn và có thể được đưa ra theo bất kỳ thứ tự nào.

Set namedArguments = WScript.Arguments.Named

Đây là một chức năng trợ giúp nhỏ:

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

Ví dụ về VBS:

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

Cách sử dụng ví dụ:

test.vbs /testArg:123

0

Để trả lời câu hỏi thưởng của bạn, câu trả lời chung là không, bạn không cần đặt các biến thành "Không có gì" trong các tập lệnh .VBS ngắn gọn như tập lệnh của bạn, được gọi bằng Wscript hoặc Cscript.

Lý do bạn có thể làm điều này ở giữa một tập lệnh dài hơn là để giải phóng bộ nhớ trở lại hệ điều hành mà VB lẽ ra đã được giữ. Ngày nay khi RAM 8GB là phổ biến và 16GB + tương đối phổ biến, điều này khó có thể tạo ra bất kỳ tác động nào có thể đo lường được, ngay cả trên một tập lệnh lớn có vài megabyte trong một biến duy nhất. Tại thời điểm này, đó là một sự cố gắng so với những ngày mà bạn có thể làm việc với RAM 1MB hoặc 2MB.

Bạn nói đúng, thời điểm tập lệnh .VBS của bạn hoàn tất, tất cả các biến của bạn sẽ bị phá hủy và bộ nhớ vẫn được lấy lại. Đặt các biến thành "Không có gì" chỉ đơn giản là tăng tốc quá trình đó và cho phép bạn thực hiện nó ở giữa một tập lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.