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

이 스크립트는 “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”도 필요하지 않을 수도 있습니다. 이 두 질문에 대한 답을 알고 있으면 알려주세요.



답변

를 사용 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”으로 설정해야합니까?


답변

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

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

등등. 매개 변수 수 :

Wscript.Arguments.Count


답변

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


답변

선택 사항이며 임의의 순서로 지정할 수있는 명명 된 인수 를 사용할 수도 있습니다 .

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


답변

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

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

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


답변