윈 도 우 명령창 숨겨서 실행하기
2013.01.26 14:18
명령창을 숨겨서 실행하는 법을 찾다가 괜찮은 방법이 있어서 소개합니다.
결론적으로 얘기하면 VBScript 를 이용하는 것입니다.
HideWindow.vbs 란 파일을 만들어서 C:\Windows 폴더에 두었다면,
명령창이나 레지스트리에서
wscript.exe C:\Windows\HideWindow.vbs ?"원하는 명령"
?
을 등록해 사용하면 됩니다.
다음은 HideWindows.vbs 파일의 내용입니다.
---------------------------------------------
?
Dim WshShell, objArgs
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objArgs = WScript.Arguments
strReArgs = Replace(objArgs(0),"#",chr(34))
WshShell.Run ReplaceArgs, 0
Set WshShell = Nothing
Set objArgs = Nothing
WScript.Quit
----------------------------------------------
저도 잘 모르지만 아는 한도내에서 간단히 설명해보겠습니다. 이해가 안되는 부분은 검색해 보시면 훨씬 자세히 설명된 글들이 있어요.^^
Dim WshShell, objArgs
변수를 선언하는 내용입니다. WshShell 이나 objArgs 이 변수명인데 임의로 정한 이름입니다.
메모리 상에 저장할 공간을 마련해 둔다는 의미로 이해하시면 될 것 같습니다.
Set WshShell = WScript.CreateObject("WScript.Shell")
위에서 선언한 변수 WshShell 에 값을 할당하는 내용입니다.
WScript.CreateObject("WScript.Shell") 는 "WScript.Shell" 개체(Object) 를 생성하는 내용입니다.
WScript 는 최상위 개체이고 그하위 개체를 사용하고자 할때에는 CreateObject 메서드(method) 를 통해
개체를 생성한 다음 사용합니다.
WScript.Shell 개체를 생성하는 이유는 창을 숨겨서 실행할 수 있는 Run 메서드가 이 개체에 속해 있기 때문입니다.
WshShell 이라는 변수에 할당되는 것이 개체일 경우에는 Set 문을 사용합니다. 밑에 나오겠지만 개체가 아닌 경우에는
Set 을 사용하지 않습니다.
Set objArgs = WScript.Arguments
objArgs 라는 변수에 WScript.Arguments ( 인수들) 이라는 개체를 할당하는 내용입니다.
Arguments 는 WScript 의 속성인데 개체를 반환하기 때문에 Set 문을 사용합니다.
HideWindow.vbs 다음에 사용하는 내용이 여기에 속합니다.
예를들어 "wscript.exe C:\Windows\HideWindow.vbs a b c d" 에서보면 뒤에 붙어있는 a b c d 가 인수들 입니다.
인수들의 인덱스가 0번 부터 시작하기 때문에 0번 인수가 a, 1번 인수가 b, 2번 인수가 c, 3번 인수가 d입니다.
strReArgs = Replace(objArgs(0),"^",chr(34))
strReArgs 라는 변수에 값을 할당하는 내용입니다.
strReArgs 는 임의로 만든 변수명입니다.
Replace 는 함수인데 어떤 일을하는 함수이냐면,뒤에 표시되어 있는 objArgs(0) 에서 # 문자를 chr(34)로 바꾸어주는 함수입니다.
objArgs(0) 는 위에서 objArgs 에 WScript.Arguments 라는 인수들 개체를 할당했었는데 0번 인덱스를 지정해서 첫번째 인수를
받아오는 것입니다.
# 는 단순한 기호이고 제가 임의로 정한 것입니다.
chr(34) 에서 chr 는 함수인데 뒤에 나온 숫자를 아스키 코드에 대응하여 바꾸어줍니다. 아스키코드 34 번은 " (큰따옴표)입니다.
이러한 변환작업을 하는 이유는 VBScript 에서 인수를 받아올때 따옴표를 모두 제거하고 받아오기 때문에
따옴표를 만들어 주기 위해서 이러한 작업이 필요합니다.
예를 들어 ab cd.cmd 라는 공백이 들어 있는 배치파일이 있을때, wscript.exe C:\Windows\HideWindow.vbs "ab cd.cmd" 라는
명령을 사용하면 위 VBScript 안에서는 WshShell.Run ab cd.cmd, 0 라는 명령이 되어서 실패하게 됩니다. (ab 라는 파일을 찾는 것이죠) 때문에 # 기호를 추가하여 따옴표로 바꿔주는 작업을 하는 것입니다.
올바른 명령 사용은 wscript.exe C:\Windows\HideWindow.vbs "#ab cd.cmd#"입니다.
모든 권한 얻기란 레지스트리를 예로들면 cmd.exe /c takeown /f "%1" && icacls "%1" /grant administrators:F 이란 명령이 있는데
"%1" 에서 따옴표도 # 로 바꾸어서 사용하면 됩니다. wscript.exe C:\Windows\HideWindows.vbs "cmd.exe /c takeown /f ^%1^ && icacls #%1# /grant administrators:F" 로 등록하여 사용하면 됩니다.
WshShell.Run strReArgs, 0
WshShell 은 WScript.Shell 을 받은 변수입니다.
이 개체의 메서드중 하나인 Run 메서드는 창을 숨겨서 실행할 수 있는 옵션이 있습니다.
strReArgs 는 인수들 중에서 첫번째 인수를 # 기호를 " 로 바꾼 내용을 받은 변수 입니다. 우리가 실행하고자하는 배치파일이나
명령어가 들어가게 되죠.
0 은 창을 숨겨서 실행하는 옵션입니다. 다른 옵션에 대해서는 검색으로...
Set WshShell = Nothing
WshShell 변수에 Nothing 을 할당한다는 의미인데 한마디로 WshShell 변수에 할당했던 저장공간을 지우고 메모리에서 해제한다
정도로 생각하면 될 것 같습니다.
WScript.Quit
Quit 메서드는 스크립트를 종료시키는 명령입니다.
제가 변수를 선언하고 변수에 개체를 할당하고 했지만 어차피 한번만 사용되는 개체라면 변수에 할당할 필요없이 바로 사용해도 됩니다. 위에 사용한 코드를 아래와 같이 간단하게 줄여서 사용할 수도 있습니다.
-----------------------------------------------
strReArgs = replace(WScript.Arguments(0),"#",chr(34))
WScript.CreateObject("WScript.Shell").Run strReArgs, 0
-----------------------------------------------
<01.31 수정>
^ 기호를 # 기호로 수정합니다.
^ 기호가 필요한 곳이 있네요.;;
댓글 [2]
-
내찬RB 2013.01.29 12:59
-
poison 2013.01.29 16:02
첨부한 Arguments.vbs 는 인수를 보여주는 스크립트입니다.
사용법은 명령창에서
Arguments.vbs 아무거나 입력
?
입니다. 결과를 보여주는데 인수는 몇개인지 그 내용은 무엇인지를 보여줍니다.
테스트 해보면 " 는 어떻게 해서든 인수로 전달이 되지 않는 것을 알 수 있습니다.
사실 인수로서 간단한 파일명을 전달하는 것이라면 치환작업은 필요가 없습니다.
위에서 든 예중에서 파일명에 공백이 들어 있더라도 스크립트 안에서 따옴표를 추가해 주면 됩니다.
그런데 모든권한 얻기 레지스트리에서 보듯이 cmd.exe 를 이용한 명령문에서는 따옴표가 꼭 필요한 곳이 있습니다.
"%1" 이 그 중 하나인데요, 이게 인수로 전달되면 따옴표 없이 %1 로 전달되기 때문에 공백이 들어가 있는 파일이나 폴더에서는 오류가 생기게 됩니다.
그래서 만만한 문자 하나를 골라서 " 로 치환되도록 처리했는데 그 문자가 명령문에서 가장 안쓰인다고 생각되는 # 를 선택한 것입니다.
사용자는 인수 중에서 따옴표가 꼭 필요한 부분에 " 대신 # 기호만 넣어주면 됩니다.^^
번호 | 제목 | 글쓴이 | 조회 | 추천 | 등록일 |
---|---|---|---|---|---|
[공지] | 강좌 작성간 참고해주세요 | gooddew | - | - | - |
1722 | 윈 도 우| 영문 폴더를 한글로 보이게 만들기 (실제로는 영문폴더) [2] |
|
19533 | 3 | 02-01 |
1721 | 윈 도 우| HDD들 절전상태일때 파일복사는 CTL+C,V로(오른쪽버튼 X) [1] |
|
16483 | 2 | 01-30 |
1720 | 소프트웨어| foobar 로 음악방송을 하는 방법 [13] |
|
20617 | 6 | 01-30 |
1719 | 소프트웨어| foobar 를 가장 최적화 하여 쓰는 방법 [34] |
|
29053 | 15 | 01-30 |
1718 | 소프트웨어| 중국판 EasyDRV 설치방법 [13] |
|
34474 | 15 | 01-29 |
1717 | 윈 도 우| WIN PE의 ISO파일 풀고 wim파일 만으로 SETTING 방법 [8] |
|
25113 | 13 | 01-29 |
1716 | 윈 도 우| Total Uninstall 등록팁 [5] | 고독남 | 21086 | 3 | 01-29 |
1715 | 하드웨어| 더블 클릭되는 마우스 고치기(?) [6] | 귀신 | 16246 | 2 | 01-29 |
1714 | 윈 도 우| 윈도우 7 자체 백업 기능으로 USB에 백업시 하드에서보다 ... [2] | asklee | 16340 | 0 | 01-29 |
» | 윈 도 우| 명령창 숨겨서 실행하기 [2] | poison | 15415 | 1 | 01-26 |
1712 | 윈 도 우| [이미지, 추가사항] WIN PE의 ISO FILE SETTING 방법 [21] |
|
21846 | 12 | 01-23 |
1711 | 윈 도 우| lame mp3 codec 팝업으로 고생하시는분을 위해 [1] | sky9 | 13694 | 1 | 01-22 |
1710 | 윈 도 우| 윈빌더(WinBuilder)로 윈도우 7 PE 만들기 [8] |
|
27716 | 4 | 01-21 |
1709 | 윈 도 우| [컴퓨터매니아의 컴퓨터 살펴보기] 1-(1) - MSDaRT 설치, ... [7] |
|
18772 | 11 | 01-20 |
1708 | 소프트웨어| [Orbit] 광고배너와 Software Updater 제거 [7] |
|
14652 | 7 | 01-17 |
1707 | 윈 도 우| 윈도우8에서 시작시 프로그램(임의의 사용자 바로가기파일)... [1] | 삿또 | 15525 | 0 | 01-16 |
1706 | 윈 도 우| 윈도 8 메트로 건너뛰고 바로 바탕화면으로 부팅하기 [4] | 수암 | 19294 | 2 | 01-16 |
1705 | 윈 도 우| [누구나!다하는!] 윈도우 8 PE 빌더와 제작방법 II [7] |
|
15594 | 2 | 01-15 |
1704 | 소프트웨어| 반디집 오른쪽 메뉴아이콘 바꾸기 [3] |
|
13584 | 2 | 01-13 |
1703 | 윈 도 우| [누구나!다하는!] 윈도우 8 PE 빌더와 제작방법 (펀글) [13] |
|
40656 | 7 | 01-13 |
유익한 강좌 잘 봤습니다.
" 를 굳이 ^로 치환하는 이유가 있을까요?