Windows XP 이상 Windows : 창이 표시되지 않고 백그라운드에서 배치 파일을 실행하려면 어떻게해야합니까?


121

이미 비슷한 질문 ( Windows 부팅시 백그라운드에서 배치 파일 실행)에 답변 했지만 이번에는 배치를 시작해야합니다.

  • 다른 배치에서
  • 콘솔 창이 표시되지 않고
  • 모든 인수 가 보이지 않는 배치로 전달됩니다.

첫 번째 일괄 처리는 콘솔 창에서 실행됩니다. 그러나 두 번째 배치 ( 비동기 방식으로 첫 번째 배치에 의해 시작됨 )도 콘솔 창을 표시하는 것을 원하지 않습니다 .

나는 그것을 수행하는 VBScript 스크립트를 생각해 냈고 다른 사람들이 참조 할 수 있는 대답으로 스크립트를 넣었 지만 다른 아이디어 / 솔루션이 있으면 자유롭게 기여하십시오.

참고 : Windows 명령 프로세서의 콘솔 창은 많은 사람들이 실제로 올바른 DOS 창을 사용하지 않는 이름입니다.


답변 해 주셔서 감사합니다. 내가 이해 한 바에 따르면, 보이지 않는 모드에서 실행하기 위해 스크립트를 비동기 적으로 호출해야하는 경우 :

  • 이미 콘솔 창에있는 두 번째 스크립트 start /b에서는 충분합니다.
  • Windows에서 두 번째 창을 트리거하지 않고도 내 솔루션이 여전히 유효합니다.

다른 배치 파일에서 배치 파일을 시작하고 있습니까? 이미 실행중인 배치 파일에 창이 있습니까?
Oddthinking

예,이 다른 (첫 번째) 배치는 DOS 창에서 실행됩니다. 그러나 두 번째 배치 (비동기 방식으로 첫 번째 실행)가 창 ( 'start / b'명령으로 발생)도 표시하는 것을 원하지 않습니다.
VonC

답변:


53

비동기 적으로 실행하려면 두 번째 배치 파일이 필요합니까? 일반적으로 하나의 배치 파일은 call명령 과 동시에 다른 파일을 실행 하고 두 번째 파일은 첫 번째 창을 공유합니다.

second.bat 를 사용 하여 첫 번째 창을 공유하는 첫 번째 배치 파일 동기식 으로 두 번째 배치 파일을 시작할 수 있습니다 . 두 배치 파일이 동시에 콘솔에 쓰면 출력이 겹치고 해독 할 수 없습니다. 또한 두 번째 배치 파일의 끝에 명령 을 입력 하거나 모든 작업이 완료되면 두 번째 셸 내에있게 됩니다.start /b exitcmd


1
옳은. start / b가 새 창을 열 것이라고 믿었지만 DOS 창에서 실행하면 동일한 창을 공유합니다.
VonC

110

가능한 해결책은 다음과 같습니다.

첫 번째 스크립트에서 다음 줄을 사용하여 두 번째 스크립트를 호출합니다.

wscript.exe invis.vbs run.bat %*

실제로 다음을 사용하여 vbs 스크립트를 호출하고 있습니다.

  • 스크립트의 [경로] \ 이름
  • 스크립트에 필요한 다른 모든 인수 ( %*)

그런 다음 invis.vbs는 Windows Script Host Run () 메서드를 사용 하여 스크립트를 호출합니다 .

  • intWindowStyle : 0은 "보이지 않는 창"을 의미합니다.
  • bWaitOnReturn : false는 첫 번째 스크립트가 두 번째 스크립트가 완료 될 때까지 기다릴 필요가 없음을 의미합니다.

다음은 invis.vbs입니다.

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2K 뷰는 어떤 좋은 포스트 + 대답은, 더 많은 사람들이이 스레드 투표까지해야
릭 도쿄

훌륭한 솔루션, 정확히 필요한 것.
nikhil 2012-06-14

유일한 문제는 "cmd.exe"라는 이름의 프로세스가 생성된다는 점입니다.이 프로세스는 앞으로 찾기 어렵습니다.
Aditya Gupta

12

배치 파일을 exe로 변환합니다. Bat To Exe Converter 또는 Online Bat To Exe Converter 를 사용 해보고 유령 응용 프로그램으로 실행하는 옵션을 선택하십시오. 즉, 창 없음.


3
가능하지만이 경우 추가 단계를 피하도록 노력하겠습니다.
VonC

21
나는 일반적으로 편집증이 아니지만 익명으로 누군가가 나를 위해 그 exe를 생성하게하는 것이 어리석지 않습니까? 모든 종류의 악의적 인 물건이 주입 될 수 있습니다.
Tobias

9

나는 이것이 DOS 창을 열지 않고 배치 파일을 실행하는 가장 쉽고 짧은 솔루션이라고 생각합니다. 주기적으로 실행되도록 일련의 명령을 예약하려는 경우 매우 산만해질 수 있으므로 DOS 창이 계속 팝업됩니다. 여기에 해결책이 있습니다. . VBS 스크립트를 사용하여 배치 파일 호출 ...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

위의 행을 편집기에 복사하고 .VBS 확장자로 파일을 저장하십시오. .BAT 파일 이름과 경로를 적절히 편집하십시오.


1
흥미로운 접근 방식, 확실히 내 솔루션보다 짧습니다. +1
VonC 2014 년

훌륭한 솔루션입니다. 이것을 읽고 나는 실제로 사용할 필요가 없다는 것을 Set WshShell = Nothing알았고, 나를 위해 잘 작동했으며 더 작은 방법을 사용할 수 있습니다.
Patrick Bard

7

다음은이를 달성하기위한 방법 모음입니다. 시작된 프로세스의 PID도 반환하려고 시도했습니다 (모든 링크 된 스크립트는 편리한 이름으로 다운로드하여 저장할 수 있습니다).

1) IEXPRESS 솔루션은 오래된 win 95/98 시스템에서도 사용할 수 있습니다. Iexpress는 여전히 Windows와 함께 패키지로 제공되는 매우 오래된 도구입니다. 인수는 명령과 해당 인수 만 받아들이 기 때문입니다.

사용 예 :

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS- 명령과 인수라는 두 개의 인수 만 허용합니다. 또한 권한이 상승 된 상태로 시작되었는지 확인하고 가능한 경우 WEVTUTIL을 사용하여 프로세스의 PID를 가져옵니다 (Vista 이상에서 사용 가능하므로 최신 버전의 Windows에서 PID) 명령.

사용 예 :

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell'- 스크립트는 'WScript.Shell'의 전체 래퍼이며 가능한 모든 옵션은 명령 줄 옵션을 통해 설정할 수 있으며 jscript / batch 하이브리드이며 bat로 호출 할 수 있습니다.

사용 예 (자세한 내용은 '-h'로 도움말 인쇄) :

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup'- 다시 전체 래퍼 및 모든 옵션은 명령 줄 인수를 통해 액세스 할 수 있습니다. 이번에는 일부 Jscript 및 일부 VBScript 코드가 포함 된 WSF / batch 하이브리드이지만 시작된 프로세스의 PID를 반환합니다. 숨겨지지 않음 X / Y 좌표와 같은 일부 옵션을 사용할 수 있습니다 (모든 실행 파일에 적용 할 수는 없지만 예를 들어 cmd.exe는 좌표를 허용 함).

사용 예 (자세한 내용은 '-h'로 도움말 인쇄) :

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5). NET 솔루션 . ProcessStartInfo 옵션의 대부분의 옵션이 사용됩니다 (하지만 결국 모든 것을 포함하기에는 너무 피곤했습니다).

사용 예 (자세한 내용은 '-h'로 도움말 인쇄) :

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

다른 질문에서는 autoexnt를 제안했습니다 . 이 상황에서도 가능합니다. 서비스를 수동으로 실행하도록 설정하십시오 (즉, 시작시 자동이 아님). 배치를 실행하려면 원하는 배치 파일을 호출하도록 autoexnt.bat 파일을 수정하고 autoexnt 서비스를 시작하십시오.

이를 시작하는 배치 파일은 다음과 같을 수 있습니다 (예상되지 않음).

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

이렇게 시작된 배치 파일은 시스템 사용자로 실행되므로 네트워크 공유에 자동으로 액세스 할 수 없습니다. 그러나 net use 를 사용하여 원격 서버에 연결할 수 있습니다 .

이를 얻으려면 Windows 2003 Resource Kit다운로드 해야합니다. Resource Kit는 Windows XP와 같은 다른 버전의 Windows에도 설치할 수 있습니다.


1
흥미롭지 만이 시나리오에 대해서는 과잉입니다.
VonC

2

"runas"를 사용하거나 Windows 예약 작업에서 다른 사용자로 예약하여 다른 사용자 이름으로 실행합니다.


가능하지만 정확히 내가 원하는 것은 아님 (백그라운드에서 직접 비동기 호출)
VonC

0

.vbs 파일을 통해 .bat 파일을 실행할 수 있습니다
. 다음 코드를 .vbs 파일에 복사합니다.

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

당신은 또한 사용할 수 있습니다

start /MIN notepad.exe

PS : 안타깝게도 최소화 된 창 상태는 실행할 명령에 따라 다릅니다. VG가 작동하지 않습니다.

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