我有一个按计划运行的批处理脚本,有时需要手动运行。此脚本pause
中有一个,因此echo
当脚本手动运行时,ed 消息仍然可见 - 也就是说,如果不暂停,控制台窗口会自动关闭,而用户不知道原因。
我找到了解决方案当一个批处理脚本调用另一个批处理脚本时,并涉及传递可选参数如果存在,脚本将跳过暂停。这两种情况都需要更改批处理脚本。
有没有一种简单的方法可以运行批处理脚本,并禁用或跳过暂停,而无需更改脚本本身?也许是类似的东西myBatch.bat --skippauses
?
答案1
跳过批处理文件逻辑运行的几种快捷方法
开始: 我不知道PAUSE
在批处理脚本中跳过命令的任何方法(至少在您的情况下无法满足您的要求),除非您使用我将在下面详细列出的两个解决方案之一。我不知道有这样的开关--skippauses
可以通过这样一个简单的解决方案来实现这一点,即在调用或执行批处理脚本时,只需跳过任何或所有PAUSE
命令,而无需事先更改批处理脚本的实际逻辑,从而可能接受它作为参数,然后不执行命令PAUSE
,但您必须更改批处理脚本逻辑才能使其以这种方式工作。
解决方案 1(不改变您调用的批处理脚本文件)
动态构建一个新的动态构建脚本,与被调用脚本的逻辑相匹配并排除所有包含字符串的行PAUSE
(不区分大小写),然后运行动态构建脚本,其逻辑与被调用脚本相同,但减去所有包含的行PAUSE
,从而减去任何PAUSE
命令。
只需添加类似于myBatch.bat
下面示例的内容,并确保将目录等指向需要的位置。本质上,这将FINDSTR /i /v
针对您的脚本运行命令CALL
,然后逐行读取它,但排除包含PAUSE
不区分大小写的字符串的所有行,并将其直接传输到具有唯一名称的新动态构建的批处理脚本,然后CALL
针对该脚本运行您的命令。
示例脚本
@ECHO OFF
:: Parse out space from hour part of time and replace with a zero (for hours of 00:00 - 09:59)
SET hh=%TIME:~0,2%
SET hh=%hh: =0%
SET DateString=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%_%hh%%TIME:~3,2%%TIME:~6,2%
SET DynScriptName=%Temp%\NOPAUSE_%~N0_%DateString%.cmd
:: If DynScriptName already exists, just delete it
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"
:: Use FINDSTR to ignore all lines containing "pause" but pipe all other lines to DynScriptName to later CALL/EXECUTE
:: /i switch denotes case insensitivity, /v switch denotes exclude value in results piped to DynScriptName
FINDSTR /i /v "pause" "C:\folder\folder\myBatch.bat">"%DynScriptName%"
:: Call the dynamically built script without PAUSE command lines
CALL "%DynScriptName%"
:: If DynScriptName already exists, just delete it (post cleanup)
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"
GOTO EOF
结论: 这(Solution 1
)应该能够满足您的两个需求:
现在,您可以运行动态构建的脚本,而无需
PAUSE
基于运行脚本的命令,该脚本每次运行时都会根据该脚本的 [内容] 逻辑动态构建一个新脚本,但会排除所有PAUSE
包含的行,从而消除PAUSE
运行的命令。此外,这确保你正在运行的当前脚本
CALL
不需要修改的为了适应您查询中所要求的更改,因为它只是动态地重建另一个不包括您请求的更改。此外,另一个简单的解决方案如下
Solution 2
,确实提供了一种对您调用的脚本进行更改的方法,如果您也想考虑这种简单的方法,您可以使用我的Solution 2
示例以及其他文章来了解该级别所需的更改。
解决方案 2(确实改变了批处理脚本逻辑)
在包含命令的脚本中PAUSE
,您可以像下面这样为其添加标签。然后,您可以在命令后面的逻辑上添加标签,PAUSE
这样您就可以添加IF
逻辑来查找执行脚本时传递给脚本的第一个参数。
就在PAUSE
命令标签上方(意义 :PauseLabel
在我的例子中),您应该将 放在下一IF [%1]==[] GOTO PauseLabel
行,然后将 放在其下方GOTO SkipPause
。
这告诉它如果脚本被执行并且没有传递第一个参数,那么转到:PauseLabel
并执行那里的操作,也就是说PAUSE.
如果传递了任何第一个参数,那么它将转到:SkipPause
并执行下一步的操作,这是没有命令的其余逻辑PAUSE
。
这样,人们只需双击它(不传递参数)就可以全天手动运行它,但是您的计划作业可以传递您想要的任何第一个参数(它只是一个虚拟参数)以确保逻辑IF
可以确认它存在或是否为 NULL。
带有PAUSE
命令第一个参数的脚本检查并跳过下面的逻辑示例
<Script logic before PAUSE>
IF [%1]==[] GOTO PauseLabel
GOTO SkipPause
:PauseLabel
PAUSE
:SkipPause
<Rest of your batch logic>
将参数示例传递给脚本(其调度位置)
myBatch.bat SkipPause
请注意,当您安排批处理时,第一个参数可以是、SkipPause
或您想要的任何其他值。 的逻辑只是说,“执行脚本时是否有参数传递给脚本,如果有,则转到,如果没有,则转到。dummy
DosEquis
IF
:SkipPause
:PauseLabel
答案2
我用一个非常简单的解决方案解决了这个问题......
我只是使用根据任何标准在文件顶部设置的变量。
例如:
if %1==skip set skipPause=1 else skipPause=0
然后在批处理文件中执行以下操作:
if skipPause=1 pause
非常简单和优雅!(另外,您还可以将它用于其他操作,例如跳过某些“echo”语句,如下所示:
if skipPause=0 (
echo I'm doing something now.
do something
echo I'm done
pause
)
如果“skipPause”设置为1,则不会发生反馈。
瞧!