从任务计划程序运行批处理脚本时跳过暂停

从任务计划程序运行批处理脚本时跳过暂停

我有一个按计划运行的批处理脚本,有时需要手动运行。此脚本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)应该能够满足您的两个需求:

  1. 现在,您可以运行动态构建的脚本,而无需PAUSE基于运行脚本的命令,该脚本每次运行时都会根据该脚本的 [内容] 逻辑动态构建一个新脚本,但会排除所有PAUSE包含的行,从而消除PAUSE运行的命令。

  2. 此外,这确保你正在运行的当前脚本CALL不需要修改的为了适应您查询中所要求的更改,因为它只是动态地重建另一个不包括您请求的更改。

  3. 此外,另一个简单的解决方案如下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或您想要的任何其他值。 的逻辑只是说,“执行脚本时是否有参数传递给脚本,如果有,则转到,如果没有,则转到。dummyDosEquisIF: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,则不会发生反馈。

瞧!

相关内容