2011-01-14 3 views
16

VBS가 wscript 대신 cscript를 사용하여 강제로 실행되도록 stackoverflow 승인 (따라서 올바른) 방법은 무엇입니까? 사용자가 시도한 것과 관계없이 무엇입니까?wscript 대신 cscript를 사용하여 VBS를 강제로 실행하십시오.

빠른 Google 검색은 많은 예제를 보여 주지만 그 중 일부는 작동하지 않으며 종종 인수로 실행되었을 수도 있다는 사실을 처리하지 못하는 사람들도 있습니다. 가장 좋은 방법은. 나는이 아마 쉽게 인수를 처리하기 위해 수정 될 수 있음을 감사하지만,이 문제를 접근하는 가장 좋은 방법이 될 수 없습니다 것을 깨닫게

sExecutable = LCase(Mid(Wscript.FullName, InstrRev(Wscript.FullName,"\")+1)) 
If sExecutable <> "cscript.exe" Then 
    Set oShell = CreateObject("wscript.shell") 
    oShell.Run "cscript.exe """ & Wscript.ScriptFullName & """" 
    Wscript.Quit 
End If 

:

여기에 인수를 처리하지 않는 한 예입니다.

배경 : DOS 배치 파일 또는 예약 된 작업에서 두 ​​번 클릭하거나 실행할 가능성이 높은 스크립트를 작성하고 있습니다. 하나 이상의 선택적 명령 행 인수를 포함 할 수 있습니다.

+0

WScript.Arguments의 처리를 추가하면 설정됩니다. –

+0

@ 카일 : 나에게 대답하는 것처럼 들리지만 의견이 아닙니다. – AnthonyWJones

+0

당신이 직접 대답 한 것처럼 보입니다. 나는 단지 확인하고있었습니다. –

답변

19

내 주인공, 어떤 순수한 쓰레기. 그것은 나를 그런 울퉁불퉁 한 코딩 (누구에게도 불쾌감을 느끼지 못함)을보기 위해 울게 만든다. 진지하게, 여기 내 2 펜스의 :

Sub forceCScriptExecution 
    Dim Arg, Str 
    If Not LCase(Right(WScript.FullName, 12)) = "\cscript.exe" Then 
     For Each Arg In WScript.Arguments 
      If InStr(Arg, " ") Then Arg = """" & Arg & """" 
      Str = Str & " " & Arg 
     Next 
     CreateObject("WScript.Shell").Run _ 
      "cscript //nologo """ & _ 
      WScript.ScriptFullName & _ 
      """ " & Str 
     WScript.Quit 
    End If 
End Sub 
forceCScriptExecution 

그것은 말했다 공백에 대한 인수 및 검사를 처리하는 인수 - 공간을 포함, 그것은 '같으면 원래 스크립트 인스턴스에 전달되는 파일 이름의 경우 있도록 cscript.exe에 전달되면 "토큰 화"되지 않습니다.

StdIn을 테스트하는 것 (예 : 명령 줄을 통해 누군가에게 스크립트를 전달했지만 "cscript script.vbs"사용을 잊어 버린 경우) -하지만 WScript.exe에 의해 실행되면 WScript.StdIn의 메서드는 모두 잘못된 핸들 오류를 반환하므로 테스트 할 방법이 없습니다.

"중단"할 수있는 방법이 있다면 알려 주시기 바랍니다. 필요한 경우 개선 할 의사가 있습니다.

+1

'// nologo'를 잘 사용하고 각 인수에 대해 공간 테스트 (그리고 따옴표 추가)를 잘 기억합니다. – Richard

+1

CreateObject 줄에 스크립트 이름과 인수 사이에 공백이 없습니다. 따라서 실행 명령이 실패합니다. 수정하려면'WScript.ScriptFullName & "" ""& Str'을'WScript.ScriptFullName & "" ""& Str'로 변경하십시오. – Richard

+1

FYI : 사이트에 코드를 더 잘 표시하기 위해 줄 바꿈을 추가하거나 공간을 포함하도록 스크립트를 편집했습니다. 그러나 나는 방금 공간이 누락되지 않는다는 것을 깨달았습니다. for 루프 중에는 모든 인수 앞에 접두어가 붙습니다. 인수를 서로 분리 할뿐만 아니라 인수를 스크립트 이름과 구분합니다. – JohnLBevan

1

한 가지 방법은 .vbs 대신 다른 확장명을 지정하는 것입니다. 예를 들어 .cvbs라고 말하십시오. .cvbs를 wscript.exe가 아닌 cscript.exe와 연결하면 .cvbs 파일을 실행하거나 두 번 클릭하면 wscript.exe가 호출되지 않습니다.

+0

슬프게도이 스크립트가 실행될 컴퓨터를 제어 할 수 없어 슬프게도 작동하지 않습니다. 나는 그들에게 mycode.vbs를 줄 수 있어야한다. 그러나 그것들을 실행하려고 시도하면 항상 wscript가 아닌 cscript로 실행될 것이라는 것을 알아야한다. – Richard

3

다음 CScript를 실행 .js 파일 만들기위한 JScript의 유사한 하나입니다 :

(function(ws) { 
    if (ws.fullName.slice(-12).toLowerCase() !== '\\cscript.exe') { 
    var cmd = 'cscript.exe //nologo "' + ws.scriptFullName + '"'; 
    var args = ws.arguments; 
    for (var i = 0, len = args.length; i < len; i++) { 
     var arg = args(i); 
     cmd += ' ' + (~arg.indexOf(' ') ? '"' + arg + '"' : arg); 
    } 
    new ActiveXObject('WScript.Shell').run(cmd); 
    ws.quit(); 
    } 
})(WScript); 

WScript.echo('We are now in CScript. Press Enter to Quit...'); 
WScript.stdIn.readLine(); 

https://gist.github.com/4482361

3

두 개의 작은 추가로 나를 종료 후 그 창을보고 그것의 반환 코드를 처리 할 수 ​​forceCScriptExecution.

Sub forceCScriptExecution 
    Dim Arg, Str 
    If Not LCase(Right(WScript.FullName, 12)) = "\cscript.exe" Then 
     For Each Arg In WScript.Arguments 
      If InStr(Arg, " ") Then Arg = """" & Arg & """" 
      Str = Str & " " & Arg 
     Next 
     **ret =** CreateObject("WScript.Shell").Run **("cmd /k** cscript //nologo """ & WScript.ScriptFullName & """ " & Str**,1,true)** 
     WScript.Quit **ret** 
    End If 
End Sub 

참고 : "cmd/k"를 실행하면 Windows가 실행 상태를 유지합니다. 매개 변수 "1"은 창을 활성화합니다. 매개 변수 "true"는 종료를 기다리므로 변수 "ret"가 오류 코드를 반환 할 수 있습니다.

0

내 스크립트 중 일부에 사용하는 코드입니다. 또한 인수를 처리합니다..당신이 할 일은 당신이 2 라인을 교체해야합니다 따옴표 여기

Dim WorC, Command, Arguments, I 

WorC={EnterWOrC} 'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER. 

WorC=LCase (WorC) 
If lcase (WorC)="w" Or lcase (WorC)="c" Then 

If LCase (Right (WScript.FullName,11))<> WorC & "script.exe" Then 
    command=WScript.ScriptFullName 
    Arguments="" 
    For I=0 To UBound (WScript.Arguments) 
     Arguments=Arguments & Chr (34) & WScript.Arguments(I) & Chr (34) & Space (1) 
    Next 
    CreateObject("Wscript.Shell").Run WorC & "script.exe " & Chr (34) & command & Chr (34) & Space (1) & Arguments, 1 
    WScript.Quit 
End If 
    WorC=Empty 
    Command=Empty 
    I=Empty 
    Arguments=Empty 
End If 

함께 는 "w"또는 "c"중 하나와 (2 NON-빈 줄을)를 {EnterWorC}를 교체입니다

Wscript가 들어
WorC={EnterWOrC} 'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER. 

: WorC="W" CScript를 들어

: WorC="C"

는 대소 문자를 구분하지 않습니다.

관련 문제