如何使Windowsbatch file暂停时双击?

我写了一个batch file来自动化一些任务。 我可以从命令窗口运行它并运行并显示结果。 如果我从资源pipe理器中双击它,它会立即运行并终止,所以我看不到结果。

有没有办法让batch file窗口保持打开状态,直到我通过双击图标启动它为止。

当我从命令行调用一个batch file时,我不想传递一个/ nopause参数。 我想要一个解决scheme,我可以使用batch file,而不必做任何特别的事情?

谢谢。

注意我不希望它从命令行运行时暂停! 我可以从另一个batch file中调用这个batch file来执行一个操作。 在这种情况下,我不能坐在那里继续打进。

理想情况下,如果我可以在batch file中放入一些代码,那么最好的办法是找出它的起始位置,然后暂停或不适当。

Solutions Collecting From Web of "如何使Windowsbatch file暂停时双击?"

使用:

cmd /K myBatch.bat 

作为你的捷径。

这是一个应该能正常工作的解决方案,并考虑批处理文件可能调用另一个批处理文件(“嵌套”)的可能性。

如果批处理文件是从“命令提示符”运行的,则可以使用“查找”来查找“/ c”:

 echo %cmdcmdline% | find /i "/c" 

但是,通过使用“查找”来搜索更长的字符串或批处理文件名称,您可以执行更“强健”的测试。

如果搜索字符串中有双引号,则“Find”命令将无法正常工作。要解决此问题,可以使用环境变量替换来“调整”字符串,以便与Find匹配:

 set newcmdcmdline=%cmdcmdline:"=-% 

这通常会返回:

 if the batch-file is run from a "Command Prompt" newcmdcmdline=-C:\Windows\system32\cmd.exe- if the batch-file is run by clicking on the the batch-file (or the batch-file shortcut) from "Windows Explorer" newcmdcmdline=cmd /c --D:\Path\test.cmd- - 

然后你可以使用“查找”来测试,如:

  echo %newcmdcmdline% | find /i "cmd /c --" or echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 

接下来,您需要决定是否希望“嵌套”批处理文件的行为方式与执行调用批处理文件的方式相同,或者如果您希望嵌套批处理文件始终如同执行一样从“命令提示符”。

考虑一下,如果你正在运行一个嵌套的批处理文件,然后测试这个:

 echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" 

将始终失败(不匹配),因为%newcmdcmdline%包含最外面的批处理文件的名称,而不是嵌套的批处理文件。

所以第一个解决方案对于调用的批处理文件和所有嵌套的批处理文件都是相同的。 如果你不打电话给任何批处理文件也是完美的:

在所有你喜欢做这个测试的批处理文件(调用和嵌套)中,添加这些行(通常在批处理文件的顶部附近)(如果你愿意,你可以排除echo声明):

 if not defined withincmd call :testshell if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from within a Command Prompt rem if %withincmd% EQU 0 pause 

然后,在每个批处理文件中的某个地方,添加testshell子功能:

 goto :EOF :testshell rem "Nested" batch-files won't see this because withincmd is already defined if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% set withincmd=1 echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" if %errorlevel% EQU 0 set withincmd=0 goto :EOF 

您只能在最外面的批处理文件的顶部对“testshell”进行有条件的调用。

在某些情况下,如果从“命令提示符”执行,而不是通过单击批处理文件(或批处理文件快捷方式)运行,则可能希望只有“最外层”批处理文件的行为不同。从“Windows资源管理器”。 所以,从“最外面的”批处理文件中调用的批处理文件将始终表现相同,无论它们如何运行。

为了这个工作,你有几个选择。

1)在调用另一个批处理文件之前保存“withincmd”的值,并在被调用的批处理文件返回后恢复之前的“withincmd”值。 这在大多数情况下是有一点参与的。

2)在每个批处理文件中为“withincmd”使用“全局唯一”变量名称。

3)每次您需要知道当前批处理文件的运行方式时,执行“查找”命令。

4)增加一个批处理文件的变量,并在批处理文件退出时递减,然后只测试批处理文件的运行方式,如果count-variable = 1

方法3是最简单的方法,但是如果从最外面的批处理文件(如递归)或另一个批处理文件中调用,那么测试变量(withincmd)将不会被正确设置。

以下是使用方法3的方法:

在所有你喜欢做这个测试的批处理文件(调用和嵌套)中,添加这些行(通常在批处理文件的顶部附近)(如果你愿意,你可以排除echo声明):

 call :testshell if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from (or Nested) within a Command Prompt rem if %withincmd% EQU 0 pause 

然后,在每个批处理文件中的某个地方,添加testshell子功能:

 goto :EOF :testshell if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% set withincmd=1 echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" if %errorlevel% EQU 0 set withincmd=0 goto :EOF 

在这种情况下,您必须在每个批处理文件的顶部调用一次“testshell”,然后再调用另一个批处理文件(或者每次需要知道当前的电流时调用“testshell”批处理文件运行)。

以下是使用方法4的方法:

在所有你喜欢做这个测试的批处理文件(调用和嵌套)中,添加这些行(通常在批处理文件的顶部附近)(如果你愿意,你可以排除echo语句):

 if not defined nestinglevel set nestinglevel=0 set /A nestinglevel=nestinglevel+1 call :testshell if %withincmd% EQU 0 echo This batch-file: %~dpf0 was executed directly (from Windows Explorer, ...). if %withincmd% EQU 1 echo This batch-file: %~dpf0 was executed from (or Nested) within a Command Prompt rem if %withincmd% EQU 0 pause 

然后,在每个批处理文件中的某个地方,添加testshell子功能:

 goto :EOF :testshell if not defined newcmdcmdline set newcmdcmdline=%cmdcmdline:"=-% set withincmd=1 if %nestinglevel% GEQ 2 goto :EOF echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-" if %errorlevel% EQU 0 set withincmd=0 goto :EOF 

另外,当你退出一个批处理文件返回到调用批处理文件时,请记住减少变量:

 set /A nestinglevel=nestinglevel-1 

在这种情况下,您必须在每个批处理文件的顶部调用一次“testshell”,然后再调用另一个批处理文件(或者每次需要知道当前的电流时调用“testshell”批处理文件运行)。

在所有情况下,测试%cmd%以确定当前批处理文件的运行方式,如下所示:

 if %withincmd% EQU 0 pause if %withincmd% EQU 1 goto :EOF 

在文件打印结束时

 pause 

它将等待任何键输入

我的问题是相似的 – 如果从Windows资源管理器调用,我最终需要暂停,但如果在命令窗口中则不会暂停。 我想出了这个。 在每个批处理文件的顶部,放置这个:

 if "%parent%"=="" set parent=%~0 if "%console_mode%"=="" (set console_mode=1& for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set console_mode=0) 

然后结束

 if "%parent%"=="%~0" ( if "%console_mode%"=="0" pause ) 

它处理嵌套的批处理调用,在那里你只想暂停在原始批处理文件的末尾,而不是嵌套的批处理文件。 在一个嵌套的批处理文件中, %parent%已经设置为原来的调用者,所以它不会等于嵌套的%~0 。 如果你有bat1打电话给bat2 ,就会打开在资源管理器中双击bat2的选项 – 在这种情况下, bat2会在最后暂停,而如果bat1打电话给bat2 ,那么bat2不会在最后暂停(只有bat1会暂停) 。

&语句分隔符有助于避免视觉上混乱的主要功能次要的东西。 如果你不喜欢它的外观,只要把每一个陈述放在一个新的线上。

这种方法查找/C作为启动命令( %cmdcmdline% )中的参数之一。 它假定你的批处理文件不使用/C选项。 如果您自己使用/C ,则需要检查%COMSPEC%出现在%cmdcmdline% (使用FINDSTR )中。 当资源管理器启动bat文件时,其%cmdcmdline%包含%COMSPEC%例如C:\Windows\System32\cmd.exe /C double_clicked_batch_file_name 。 在命令窗口中, %cmdcmdline%只有cmd.exe (没有路径)。 我使用CALL mybat而不是cmd.exe /C mybat ,但是您可能必须使用现有的批处理文件。

您可以将params添加到批处理调用中,并处理批处理中的有条件暂停语句。 所以当从命令行或dblclick启动时,批处理可以暂停,当从其他批处理调用时,一个/ nopause参数不会暂停。

最后在批处理文件中使用“暂停”,并等待用户输入

HTH

暂停命令会起作用吗?

Microsoft暂停文档