인수를 VBScript (cscript로 시작된 VBS 파일)에 전달할 수 있습니까?


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 개체가 해제됩니다. 이것은 보너스 질문에 대한 간단한 대답 일 뿐이며 다음과 같은 관련 질문에서 더 많은 정보를 찾을 수 있습니다.

VBA 함수 내에서 개체를 Nothing으로 설정해야합니까?

VB6에서 언제 변수를 "Nothing"으로 설정해야합니까?


빙고, 그게 다야! 매우 명확합니다. 감사합니다. (
Peter

@Peter : 보너스 질문에 짧은 답변을 추가했습니다.
Dirk Vollmar

21

VBS 내에서 매개 변수에 액세스 할 수 있습니다.

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

등등. 매개 변수 수 :

Wscript.Arguments.Count

감사합니다! (
Peter

6

명령 줄을 통해 전달 된 각 인수는 다음을 사용하여 액세스 할 수 있습니다. Wscript.Arguments.Item (0) 여기서 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 예


아하, 감사합니다. Wcript의 인스턴스를 만들 필요가 없다는 것이 흥미 롭습니다. (
Peter

1) workFolder위 답변이나 원래 질문에서 객체로 정의되지 않았으므로 Set workFolder = Nothing오류가 발생해야합니다. 2) 인수가 두 번 이상 재사용되어야한다고 제안되지 않았으므로 strFolder변수에 할당하는 것을 건너 뛸 수 있습니다. 3) 사용하는 것이 좋습니다겠습니까 x대신 0Wscript.Arguments.Item(0)
user66001

실제로 명시 적 옵션이 설정되어 있지 않으면 오류가 발생하지 않으며,이 경우 아무것도 정의되지 않았으므로 아무 것도 작동하지 않습니다. 변수에 대해서는 사실이지만 필요하지 않으며 FSO 또는 FILE 개체와 단순 with를 사용할 수 없습니다. 다양한 접근 방식이 가능합니다 ... :)
unrealtrip 2015 년

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

보너스 질문에 대답하기 위해 일반적인 대답은 아니오입니다. Wscript 또는 Cscript에서 호출되는 귀하의 것과 같은 짧은 .VBS 스크립트에서 변수를 "Nothing"으로 설정할 필요가 없습니다.

더 긴 스크립트 중간에이 작업을 수행 할 수있는 이유는 VB가 보유하고 있었을 운영 체제로 메모리를 다시 릴리스하기 위해서입니다. 요즘에는 8GB RAM이 일반적이고 16GB 이상이 상대적으로 일반적이기 때문에 단일 변수에 몇 메가 바이트가 포함 된 거대한 스크립트에서도 측정 가능한 영향을주지 않습니다. 이 시점에서 그것은 1MB 또는 2MB의 RAM으로 작업하던 시절로부터 일종의 홀드 오버입니다.

맞습니다. .VBS 스크립트가 완료되는 순간 모든 변수가 파괴되고 어쨌든 메모리가 회수됩니다. 변수를 "Nothing"으로 설정하면 해당 프로세스의 속도가 빨라지고 스크립트 중간에이를 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.