所以这是我当前的批处理文件
d:
SET PATH=%PATH%;D:\_Work\Automation\Selenium\_php5.6.14;
IF "%1"=="reports" GOTO reports
IF "%1"=="selenium" GOTO automation
IF "%1"=="phpunit" GOTO automation
IF "%1"=="auto" GOTO automation
IF "%1"=="self" GOTO self
:reports
cd "_Work\Office\Excel"
start /B call "Stored Procedure File List.xlsx"
cd "..\..\TFS\Riley\Main\ReportsSrv"
call ReportsSrv.sln
cd "..\..\..\..\Other\txt"
call "Used Tables.txt"
cd "..\..\Automation\Selenium\Misc Tasks"
call "getTables.php"
call "_getTables-results.sql"
GOTO end
:automation
cd "_Work\Automation\Selenium\_Selenium Server"
start call selenium
cd ../
GOTO end
:self
goto terminate
:terminate
exit
:end
当我运行命令startup reports
时,当我尝试在批处理文件运行后使用命令提示符时,我得到以下内容
注意:GOTO end
之后的所有内容都是我的输入,而不是批处理文件。空线是我按 Enter
当我关闭打开的Excel窗口时,似乎会发生这种情况。我怀疑它与start /B call "Stored Procedure File List.xlsx"
有关。我这样做的原因是因为只有call "Stored Procedure File List.xlsx"
批处理文件才会暂停,直到excel关闭。
我想知道当我退出excel时为什么命令提示符在这两个位置之间交换,因为我认为start /B
在后台运行命令
答案 0 :(得分:2)
在不了解如何启动xlsx文件的情况下,我将首先解释一下这种行为。
使用START / B选项执行CALL会在同一控制台窗口中启动新的cmd.exe进程。此新进程与原始cmd.exe进程共享stdin和stdout。当您关闭Excel时,第二个cmd.exe进程仍在运行。
所以现在你有两个进程争夺控制台输入和输出。输入命令时,只有一个进程会收到它。
因此,假设父进程收到第一个[Enter] - 然后打印出正常提示。第二个进程接收到第二个[Enter],并打印其提示(由于当前目录不同而不同)。
如果您发出EXIT,那么其中一个进程将终止,您将只能使用一个只有一个进程的普通控制台。
解决问题的一种方法是使用附加的EXIT命令显式启动新命令进程。
start /b cmd /c ""Stored Procedure File List.xlsx" & exit"
但我认为你可以简单地使用
start "" "Stored Procedure File List.xlsx"
如果引用START的第一个参数,则将其解释为窗口标题。因此,在xlsx文件之前的空引号。
答案 1 :(得分:0)
START - Start a program, command or batch script (opens in a new window):
语法
START "title" [/D path] [options] "command" [parameters]
- 始终包含 TITLE 这可以是一个简单的字符串,例如" My Script"或者只是一对空引号""。
- 根据Microsoft文档,标题是可选的,但取决于所选的其他选项,如果省略则可能会出现问题。
使用(我不确定/B
切换):
start "" /B "Stored Procedure File List.xlsx"
下一个类似代码的部分显示了如何重现问题(并且它与Excel无关。)
d:\bat> md \a\b\c\d
d:\bat> cd \a\b\c\d
d:\a\b\c\d> >test.txt type nul
d:\a\b\c\d> wmic process where "name='cmd.exe'" get commandline, handle, parentprocessID, Processid
CommandLine Handle ParentProcessId ProcessId
"C:\Windows\system32\cmd.exe" 6588 3284 6588
d:\a\b\c\d> start /B call test.txt
d:\a\b\c\d>
d:\a\b\c\d> wmic process where "name='cmd.exe'" get commandline, handle, parentprocessID, Processid
CommandLine Handle ParentProcessId ProcessId
"C:\Windows\system32\cmd.exe" 6588 3284 6588
C:\Windows\system32\cmd.exe /K call test.txt 5556 6588 5556
d:\a\b\c\d> cd ..
d:\a\b\c>
d:\a\b\c\d>
d:\a\b\c>
d:\a\b\c\d>
d:\a\b\c> doskey /history
doskey /history
d:\a\b\c\d> doskey /history
doskey /history
d:\a\b\c> exit /B
d:\a\b\c> doskey /history
d
cls
md \a\b\c\d
cd \a\b\c\d
>test.txt type nul
wmic process where "name='cmd.exe'" get commandline, handle, parentprocessID, Processid
start /B call test.txt
wmic process where "name='cmd.exe'" get commandline, handle, parentprocessID, Processid
cd ..
doskey /history
d:\a\b\c> wmic process where "name='cmd.exe'" get commandline, handle, parentprocessID, Processid
CommandLine Handle ParentProcessId ProcessId
"C:\Windows\system32\cmd.exe" 6588 3284 6588
d:\a\b\c> cmd /K
d:\a\b\c> doskey /history
doskey /history
exit /B
doskey /history
d:\a\b\c>
d:\a\b\c>
说明:
md
,cd
和type
):创建运营环境wmic
命令显示当前打开的cmd
窗口start
命令:start /B call test.txt
wmic
命令显示已创建子窗口(隐藏)cmd
cd ..
后面跟着一些 Enter s显示假当前目录切换doskey /history
表明我实际上是在那个孩子cmd
提示exit /B
关闭该子隐藏 cmd
提示doskey /history
并且关注wmic
表示我回到原来的cmd
提示cmd /K
会让我再次看到相同的子cmd
提示符(请参阅下一个doskey /history
),但现在正常而没有那种奇怪的切换效果。