BAT文件:打开新的命令提示窗口并在其中执行命令

238

我试图在一个BAT文件中打开一个新的命令窗口:

start %windir%\system32\cmd.exe

打开新窗口后,我想在其中执行一个BAT命令:

echo "test in new window"

我该怎么做?

11个回答

365

你可能已经找到了答案,因为询问时间已经过去一段时间了。但是我在编写ror代码时尝试做类似的事情。我想在一个新的命令行窗口中运行"rails server",这样我就不必打开一个新的命令行并再次查找我的路径。

我发现可以使用K开关来实现,像这样:

start cmd /k echo Hello, World!

在“cmd”之前加上“start”将会在一个新窗口中打开应用程序,“/K”会在新的cmd打开后执行“echo Hello, World!”。

您也可以使用/C开关来实现类似的功能。

start cmd /C pause
这将执行 "pause" 命令,但在命令执行完毕后关闭窗口。在这种情况下,当你按下一个按钮时。我发现对于 "rails server" 很有用,然后当我关闭我的开发服务器后,我不必再关闭窗口了。

2
如果您使用此命令来运行Rails服务器,则实际上不需要键入“cmd”。您只需键入“start rails s”即可。 - fbonetti
8
仅做提醒,我使用以下方法来记住它们的区别:/k 代表“保持”,/c 代表“关闭”。 - Noman_1

141
在你的批处理文件中使用以下内容:
start cmd.exe /c "more-batch-commands-here"

或者

start cmd.exe /k "more-batch-commands-here"

/c 执行由字符串指定的命令,然后终止。
/k 执行由字符串指定的命令,但保持打开状态。
/c 和 /k 选项控制命令运行结束后的行为。使用 /c 选项,终端窗口将自动关闭,使得桌面保持整洁。使用 /k 选项,终端窗口将保持打开状态。如果您想要之后手动运行更多命令,这是一个不错的选择。
请参考 cmd.exe 文档,使用 cmd /? 获取更多详细信息。
使用带有空格的参数时,命令字符串的正确格式变得更加复杂。请参考以下示例。注意某些示例中的嵌套双引号。
示例:
运行一个程序并传递一个文件名参数: CMD /c write.exe c:\docs\sample.txt
运行一个包含空格的文件名的程序: CMD /c write.exe "c:\sample documents\sample.txt"
程序路径中的空格:
CMD /c ""c:\Program Files\Microsoft Office\Office\Winword.exe""

程序路径中的空格 + 参数:
CMD /c ""c:\Program Files\demo.cmd"" Parameter1 Param2
CMD /k ""c:\batch files\demo.cmd" "Parameter 1 with space" "Parameter2 with space""

启动demo1和demo2:
CMD /c ""c:\Program Files\demo1.cmd" & "c:\Program Files\demo2.cmd""

来源: http://ss64.com/nt/cmd.html

是/k命令会保持CMD窗口打开,并允许手动运行其他几个命令。 - Bastien Gallienne
1
/k和/c之间还有一个区别。如果你使用/c,新的终端窗口名称与标准窗口名称相同,类似于"c:\Windows\system32\cmd.exe"。但是如果使用/k,它对应于你执行的命令。在某些情况下,当你需要执行多个新的终端窗口并且需要以某种方式区分它们时,这将非常有用。 - undefined

23

以上答案对我有所帮助。但是仍然需要一些解决思路。这是一个示例脚本,我用它启动3个Web开发进程。它会产生3个窗口保持打开状态,因为它们需要连续运行。

Mongo已经全局添加到我的路径中,所以我不需要像其他两个程序那样进行cd操作。当然,您的文件路径将有所不同,但希望这能帮到您。

:: Start MongoDB
start cmd.exe /k "mongod"

:: cd app directory, and start it
cd my-app
start cmd.exe /k "npm run dev"

:: cd to api server, and start that
cd ../my-app-api
start cmd.exe /k "npm run dev"

这正是我想要做的,mongod、我的React应用程序和我的后端服务器。 - akchauhan2.com

14

这并不是很容易。

最好的方法是将你想要在“新窗口”中执行的脚本部分放在一个单独的 .bat 文件中。如果你需要来自脚本其余部分的大量状态(变量等),那么这可能不太实际。一种选项是将你需要的任何值(例如要操作的目录)传递给批处理文件:

start cmd.exe stuff.bat %this_dir%
如果你需要传输大量的状态信息,可以考虑在运行时生成批处理文件:
set foo=Hello, World
set list_me=%userprofile%

set tmpdir=c:\windows\temp
set tmp=%tmpdir%\tmp.foo

del /q /f "%tmp%"

echo.echo %foo%>>"%tmp%"
echo.dir "%list_me%">>>"%tmp"

start cmd.exe "%tmp%"

del /q /f "%tmp%"

显然,这只是一个微不足道的例子。


7
感谢Stack Overflow中的所有人;这个解决方案解决了上述问题,但还扩展了自动运行以下任务:
  1. 我想运行我的rails服务器
  2. 为我的delayed_job gem运行rake jobs:worker
  3. 并打开默认的互联网浏览器以显示我的页面
  4. 最后,在我的会话期间留下一个cmd窗口以进行任何额外的命令。
我猜我的项目叫做"antiquorum."%USERPROFILE%目录中创建一个"init.bat"文件(打开一个cmd窗口并查看光标左侧的路径即可知道%USERPROFILE%是什么)。
@echo off
cd C:/projects/rails3/antiquorum
if "%1" == "antiquorum" GOTO start
if "%1" == "worker" GOTO worker
if "%1" == "server" GOTO server
if "%1" == "" GOTO end
:start
    start cmd /k %USERPROFILE%\init.bat worker
    start cmd /k %USERPROFILE%\init.bat server
    TIMEOUT 30
    start "" "http://localhost:3000/"
    GOTO end
:server
    rails s
    GOTO end
:worker
    rake jobs:work
:end

在一个新的命令行窗口中输入:C:> init antiquorum 代码会打开两个更多的命令行窗口和一个浏览器。 TIMEOUT 避免浏览器出现错误。 :start 部分承担了工作。您可以通过键入参数以单独运行任务 1、2 或 4,例如 serverworker,或不输入任何内容,保留在 "antiquorum" 项目的 根目录 中的命令行界面。
尽情享受吧。

4

在两个命令之间添加/k会按顺序执行两个命令

例如:

cmd /k echo "hello"

该命令将首先打开命令提示符(command prompt),然后执行echo "hello"命令。


3

如何在新的cmd窗口中运行文件名带有空格的Python文件:

start cmd.exe /k python "C:\Program Files\HelloWorld.py"

3
如果我理解正确,你希望在批处理文件中执行此操作,这将打开命令提示符并将您的消息打印到屏幕上。
cmd.exe hello world

希望这能帮到你。

我已经添加了echo命令,因为在CMD中“hello”不是一个命令。 - Lofty

2

延续@Dan Zuzevich的回答。下面是CD“更改目录”,如果您的目标文件位于不同的驱动器上。例如,它必须从C驱动器和D驱动器调用文件。

:: Start MongoDB
start cmd.exe /k "mongod"

:: cd app directory, and start it
cd C:\project\dev
C:
start cmd.exe /k "npm run dev"

:: cd to api server, and start that
cd D:\api\server
D:
start cmd.exe /k "npm run dev"

2

我需要运行一个环境,然后在该环境中使用Python。

如果我的文件夹结构是:

C:\environments>
C:\environments\encrypted_stuff>
C:\environments\encrypted_stuff\p1>
C:\environments\encrypted_stuff\p2>

我想要激活"encrypted_stuff"环境,然后从p2调用一个脚本,我可以在存储在C:\environments\p2.bat的批处理文件中输入以下内容

start cmd /k "Scripts\activate && cd p2 && python p2_script.py"

然后我可以为任何脚本创建一个.bat文件,而所有脚本都将使用我的“encrypted_stuff”环境。现在,我可以从桌面点击.bat文件,它将加载我的特定环境,然后在该环境中运行脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接