How can I hide ms-dos window when running a .bat file?

南楼画角 提交于 2019-11-28 07:46:43

问题


I am running a .bat file for my script (Scheduled Tak (CronJob)) per minute. When it runs, windows command prompt appears for a fiction of time.

My batch code like this;

@ECHO OFF
C:\wamp\bin\php\php5.4.3\php.exe -f "C:\wamp\www\tst\index.php" 

How can I hide this window when it run?


回答1:


Use a VBScript

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("C:\yourbatch.bat"), 0, True

Run that which will run your batch file hidden.




回答2:


I don't like VBScript solution.

Download and copy nircmd.exe to your %systemroot%\system32 folder, then add this command to first line of your batch:

nircmd.exe win hide ititle "cmd.exe"

or make your batch title custom first with title command to avoid from hiding all cmd windows, like this:

title MyBatch
nircmd.exe win hide ititle "MyBatch"



回答3:


This VBScript creates a copy of your batch file in %Temp%, executes it silently and deletes it afterwards

Dim fso

Set fso = CreateObject("Scripting.FileSystemObject")

Dim tempfolder

Const TemporaryFolder = 2

Dim WshShell, strCurDir

Set WshShell = CreateObject("WScript.Shell")

strCurDir    = WshShell.CurrentDirectory

batch = "@ECHO OFF" & vbCrLf & _
        "C:\wamp\bin\php\php5.4.3\php.exe -f C:\wamp\www\tst\index.php"

Set tempfolder = fso.GetSpecialFolder(TemporaryFolder)

WshShell.CurrentDirectory = tempfolder

i=1

n=0

While n <> 1

If (fso.FileExists(i&".bat")) Then

  i = i + 1

Else
  n = 1

End If

Wend

Set File = fso.CreateTextFile(i&".bat",True)

File.Write batch

File.Close

Dim batchfile

batchfile = fso.GetAbsolutePathName(i&".bat")

WshShell.CurrentDirectory = strCurDir

WshShell.Run chr(34) & batchfile & Chr(34), 0, TRUE

fso.DeleteFile batchfile



回答4:


I know the post is old but here is my solution, AGerman from dostips helped me code this script, its very useful.

@echo off &setlocal EnableExtensions DisableDelayedExpansion

:: Change the working directory to the directory of the batch file.
:: If the first passed argument was ~e~ (that is, the batch file was called from the VBScript)
::  then shift the parameters by one and continue at label :elevated
cd /d "%~dp0"&if "%~1"=="~e~" (shift&goto :elevated)

:: Assign the passed arguments to variable param.
set "param=%*"

:: NET SESSION fails if the batch code doesn't run with elevated permissions.
::  Assign variable __verb to "open" if the batch file runs elevated or to "runas" if it doesn't run elevated
>nul 2>&1 net session &&(set "__verb=open")||(set "__verb=runas")

:: Assign the name of the VBScript to variable vbs.
:: Assign the full name of the batch file to variable me.
:: Enable delayed variable expansion.
set "vbs=%temp%\uac.vbs"&set "me=%~f0"&setlocal enabledelayedexpansion

:: If arguments were passed, prepare them to be passed from within the VBScript by doubling the quotation marks.
if defined param set "param=!param:"=""!"

:: Write the VBScript. The ShellExecute method will run the batch file in a cmd.exe process where ~e~ will be passed as
::  first argument followed by the original arguments (saved in param). The UAC will be invoked if __verb was set to "runas".
::  Elsewise the UAC will not be invoked. For further information about the ShellExecute method see:
::  https://msdn.microsoft.com/en-us/library/windows/desktop/gg537745(v=vs.85).aspx
>"!vbs!" echo CreateObject("Shell.Application").ShellExecute "!comspec!", "/c """"!me!"" ~e~ !param!""", "", "%__verb%", 0

:: Run the VBScript in a cscript.exe process.
:: Delete the VBScript file.
:: Quit the batch execution.
cscript //nologo "!vbs!"&del "!vbs!"&goto :eof

:elevated
::~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:: Do your elevated stuff here...


来源:https://stackoverflow.com/questions/13580474/how-can-i-hide-ms-dos-window-when-running-a-bat-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!