Windows批处理脚本启动程序和退出控制台

plicqrtu  于 2023-03-09  发布在  Windows
关注(0)|答案(7)|浏览(243)

我有一个用于启动程序的批处理脚本,例如notepad.exe。当我双击此批处理文件时,记事本正常启动,但启动notepad.execmd的黑色窗口仍保留在后台。要启动notepad.exe并使cmd窗口消失,我必须做什么?

编辑:比使用\I复杂。

cmd调用cygwincygwin启动notepad
start \I \path\cygwin\bin\bash.exe
第一个窗口(cmd)消失了,但是第二个窗口(\cygwin\bin\bash.exe)仍然在后台。在cygwin脚本中,我使用了notepad.exe &,然后退出。

b1uwtaje

b1uwtaje1#

start "" "%SystemRoot%\Notepad.exe"

""放在开始路径和应用程序路径之间。

添加说明:

通常,当我们从下面的批处理文件启动程序时,我们会像OP所说的那样在后台显示黑色窗口。

%SystemRoot%\Notepad.exe

这是由于记事本在同一个命令提示符(进程)中运行。命令提示符将在记事本关闭后关闭。为了避免这种情况,我们可以使用start命令启动一个单独的进程,如下所示。

start %SystemRoot%\Notepad.exe

只要路径中没有空格,这个命令就可以了,为了处理路径中的空格以防万一,我们添加了"引号,如下所示。

start "%SystemRoot%\Notepad.exe"

然而,运行此命令只会启动另一个空白命令提示符。为什么?如果查找start /?start命令将把"之间的参数识别为它将要启动的新命令提示符的标题。因此,为了解决此问题,我们使用如下命令:

start "" "%SystemRoot%\Notepad.exe"

""的第一个参数是设置标题(我们将其设置为空),"%SystemRoot%\Notepad.exe"的第二个参数是要运行的目标命令(支持路径中的空格)。
如果您需要向命令添加参数,只需将其添加到引号中,即:

start "" "%SystemRoot%\Notepad.exe" "<filename>"
ndasle7k

ndasle7k2#

使用start notepad.exe
更多关于start /?的信息。

b1zrtrql

b1zrtrql3#

最简单的方法就是从start开始

start notepad.exe

Here您可以找到有关start的更多信息

mznpcxlj

mznpcxlj4#

%ComSpec% /c %systemroot%\notepad.exe

oprakyz7

oprakyz75#

start "" ExeToExecute

方法在Xilinx xsdk的情况下对我不起作用,因为正如@jeb在下面的注解中指出的,它实际上是一个bat文件。
所以实际上行不通的是

start "" BatToExecute

我正尝试像那样打开xsdk,它会打开一个单独的cmd,需要关闭它,xsdk可以自己运行
在启动xsdk之前,我运行(源代码)Env / Paths(带有 settings64.bat),以便xsdk.bat命令得到识别(简单地作为xsdk,带有 .bat

  • .bat* 的工作原理
call BatToExecute
wbgh16ku

wbgh16ku6#

嗯......我在我的一个批处理文件中这样做,没有使用CALL或START:

%SystemRoot%\notepad.exe ..\%URI%
GOTO ENDF

我没有安装Cygwin虽然我在Windows XP上。

dly7yett

dly7yett7#

如果你想在一个批处理文件中完成所有的事情(按照要求),我使用这个技术。
可以使用“for /f”命令从批处理文件中读取数据(并由同一批处理文件使用)。
例如,这里我们只读取批处理文件底部的消息文本,并在命令窗口中只回显该文本:

@echo off
@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j
@pause
@rem YOUR MESSAGE HERE:
rem Now is the winter of our discontent
rem Made glorious summer by this sun of York;
rem And all the clouds that lour'd upon our house
rem In the deep bosom of the ocean buried.

该行:

@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j

就是通过玩弄行尾字符(@)并使用裸露的“rem”行后面的空格作为分隔符来完成这项繁重的工作。我称之为“DUYOA.bat”,或“Dissappearing Up Your Own..."。
现在,我们可以扩展相同的原理,以便批处理文件创建一个VBS脚本,该脚本反过来读取批处理文件以创建一个从属批处理文件。
从属批处理文件从原始批处理文件的顶部派生,其中前缀为“@rem”。
还在听吗别担心我们快到了。
然后,VBS脚本由原始批处理文件启动,并在后台运行从属批处理文件:

@echo off
rem '   ###########################################
rem '   THIS BATCH FILE READS ITSELF, AND CREATES A  
rem '   VBS SCRIPT TO RUN ITSELF IN THE BACKGROUND
rem '   ###########################################

rem '   NOTE: Prefix your original batch commands with "@rem ":

@rem rem Log the starting of the batch file
@rem echo %date% %time% - %random% Started >> %USERPROFILE%\Desktop\Log.txt
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Incoming.mp3"
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Incorrect.mp3"
@rem D:\ffmpeg\ffplay -autoexit -nodisp "D:\mp3\Boing.mp3"
@rem rem Don't play the tada sound
@rem rem D:\ffmpeg\ffplay -autoexit -nodisp "C:\Windows\Media\tada.wav"
@rem rem Log the completion of the batch file
@rem echo %date% %time% - %random% Completed >> %USERPROFILE%\Desktop\Log.txt

rem '   ##########################################################
rem '   THE REST OF THIS SCRIPT STAYS THE SAME, EVEN IF THIS BATCH 
rem '   FILENAME CHANGES. IT AND CAN BE PASTED INTO ANY BATCH FILE
rem '   WHOSE COMMANDS ARE PREFIXED WITH "@rem "
rem '   ##########################################################

rem '   Any line prefixed with "@" is actioned by this master batch file:
rem '   -----------------------------------------------------------------
@set random=%temp%\%~n0%~x0-%random%.vbs
@echo MasterBatchFileName = "%~n0%~x0" > %random%
@for /f "tokens=1,* eol=@ delims= " %%i in (%~0) do @echo %%j >> %random%
@start %random%

rem '   Any line prefixed with "rem " will be written to the VBS script:
rem '   ----------------------------------------------------------------
rem On error resume next
rem Set fso = CreateObject("Scripting.fileSystemObject")
rem SlaveBatchFileName = fso.GetSpecialFolder(2) & "\" & fso.GetTempName & ".bat"
rem Set aFile = fso.CreateTextFile(SlaveBatchFileName, TRUE)
rem Const OPEN_FILE_FOR_READING = 1
rem Set objInputFile = fso.OpenTextFile(MasterBatchFileName, 1)
rem inputData = Split(objInputFile.ReadAll, vbNewline)
rem For each strData In inputData
rem     if left(strData,5)="@rem " then 
rem         aFile.WriteLine(replace(strData,"@rem ",""))
rem     end if 
rem Next
rem aFile.Close
rem objInputFile.Close
rem CreateObject("Wscript.Shell").Run SlaveBatchFileName, 0, True
rem Set aFile = fso.GetFile(SlaveBatchFileName)
rem aFile.Delete
rem Set aFile = fso.GetFile(WScript.ScriptFullName)
rem aFile.Delete

如果试图理解它让你头疼,就用下半部分:

rem '   THE REST OF THIS SCRIPT STAYS THE SAME...

向下作为子例程粘贴到您的批处理文件中,并且只需在所有原始命令前加前缀“@rem“。
我将所有的子文件都放到temp目录中,VBS脚本在退出时删除它们(以及它自己)。
你可以放弃日志和所有的评论来简化它,和/或走另一条路,在文件的最后一行添加一个3秒的弹出窗口:

rem wscript.CreateObject("wscript.Shell").Popup MasterBatchFileName & " completed!",3,MasterBatchFileName,4096+64

现在,我知道这并不能解决命令窗口 Flink 的问题,但它确实在后台运行批处理文件,而且您不需要像其他答案那样使用单独的VBS脚本。

相关问题