为什么命令提示在两个位置之间切换?

时间:2016-09-22 23:16:16

标签: excel batch-file

所以这是我当前的批处理文件

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时,当我尝试在批处理文件运行后使用命令提示符时,我得到以下内容

command prompt

注意:GOTO end之后的所有内容都是我的输入,而不是批处理文件。空线是我按 Enter

当我关闭打开的Excel窗口时,似乎会发生这种情况。我怀疑它与start /B call "Stored Procedure File List.xlsx"有关。我这样做的原因是因为只有call "Stored Procedure File List.xlsx"批处理文件才会暂停,直到excel关闭。

我想知道当我退出excel时为什么命令提示符在这两个位置之间交换,因为我认为start /B在后​​台运行命令

2 个答案:

答案 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>

说明:

  • 前三个命令(mdcdtype):创建运营环境
  • 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),但现在正常而没有那种奇怪的切换效果。