【问题标题】:I need to press a specific key and have my script " GO TO" another part in the script我需要按一个特定的键并让我的脚本“转到”脚本中的另一部分
【发布时间】:2014-12-10 20:11:18
【问题描述】:

我有一个急需帮助的批处理脚本。我使用批处理脚本从文件夹中抓取文件并移动它们。该脚本每 30 秒扫描一次文件夹,但您也可以“按一个键继续”。我需要更改它,以便我可以按特定键,不管是什么键,然后让它转到我的脚本的顶部位置进行重置。

以下是我目前拥有的精简版。

@echo off

set /p username=ENTER LOGIN:

echo.

:pc

echo   1 -- Flats
echo   2 -- Simple Tabletop

set /P rmFunc="Enter a choice: "
for %%I in (1 x) do if #%rmFunc%==#%%I goto run%%I

:run1
set pc=300
goto begin

:run2
set pc=400
goto begin

:begin
set studio=TT
set computer=Handbag_1
set setnumber=
set studiosetnumber=%studio%_%setnumber%
set delay_swch=5
set delay_loop=30

:bottom

echo logged in as: %username%

timeout /t %delay_loop%
GOTO BOTTOM

【问题讨论】:

  • 我认出了这段代码的一部分。 :) 不知道你在问什么,但我很高兴你选择使用我的菜单输入方法。好吧,至少是其中的一部分。它似乎缺少一些东西,例如for %%I in (1 x) 括号中的2,如果选择不在有效值的for 循环中,则为goto pc,以及与抓取文件和移动文件有关的任何内容。
  • 我把它精简到了网站仍然允许我发布的最低限度,脚本还有更多内容。如果您复制并运行它,我的要求会变得更加清晰.. 脚本每 30 秒扫描一次文件夹,移动文件,然后倒计时 30 秒并重复.. 我希望能够按 ENTER 或CTRL+W 等,并让它重置脚本,而不是简单地重新启动 30 秒倒计时。我的脚本在每个文件的末尾放置一个代码,您在启动时选择代码。现在您必须关闭脚本并重新启动才能更改代码。
  • 我需要它像正常一样执行,但可以选择按一些键盘键,或者 CTRL+ 键盘并让它返回到您在顶部选择的位置..

标签: batch-file if-statement command set goto


【解决方案1】:

使用 TIMEOUT 时无法确定按下了哪个键,因此该命令无济于事。

您可以使用带有 /T(超时)和 /D(默认)选项的 CHOICE 命令。您不能再简单地按任何键。相反,您只能按一个键重新启动,然后按另一个特定键继续,或者等到返回默认值(继续)。最大的缺点是它不再有视觉倒计时。

echo Press C to Continue, or R to Restart
choice /c cr /d c /t 30 /n /m "The process will automatically continue in 30 seconds "
if errorlevel 2 goto pc
goto bottom

您可以通过添加第三个未记录的默认选项并将超时设置为 1 秒来显示倒计时。如果返回默认值,则它会递减计数器。一旦计数器达到 0,则所需的时间已经过去,您将其视为继续。

我使用 SET /P 技巧来显示不带换行符的提示。我以回车结束,以便从同一行的开头显示下一个提示。

倒计时时间会有点偏,但应该足够好了。

必须定义回车变量,并且必须在靠近顶部(在任何循环标签之前)启用延迟扩展。

:: Define CR to hold a carriage return (0x0D)
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A"

:: Delayed expansion must be enabled to use the CR variable
setlocal enableDelayedExpansion

定时器代码就变成了

set wait=15
:waitLoop
<nul set /p ="Press C to Continue, or R to Restart. Auto continue in %wait% seconds.   !CR!"
choice /c 0cr /t 1 /d 0 >nul
if errorlevel 3 echo(&goto pc
if errorlevel 2 echo(&goto bottom
set /a wait-=1
if %wait% equ 0 echo(&goto bottom
goto :waitLoop

【讨论】:

  • 只要脚本将继续自行运行,就不需要显示计时器。您的第一条评论听起来像我需要的。我是编写代码的新手,所以我为听起来一毛钱道歉,但我不知道该怎么写。我知道它取代了我在底部的时间...如果我可以按 C 或 R 或​​其他任何东西并让它完全重新启动脚本或移动到 GO TO 位置,这对我们来说将是神奇的...
  • 感谢您建议使用“选择”命令,这需要一些工作,但我现在已经设法使这项工作完美地满足了我的需求,到目前为止.. 如果没有,我可能会再次联系t 工作。再次感谢..感谢其他所有人试图帮助我,我非常感谢!
【解决方案2】:

timeout 不返回 errorlevel 如果被中断,所以解决这个问题的一种方法可能是时间 timeout

@ECHO Off
SETLOCAL
SET /a "starttime=1%time:~-5,2%%time:~-2%"
timeout /t 30
SET /a "endtime=1%time:~-5,2%%time:~-2%"
IF %endtime% lss %starttime% SET /a endtime +=6000
SET /a elapsed=endtime - starttime
ECHO %elapsed%

GOTO :EOF

elapsed 应该包含以数十毫秒为单位的结果时间。对于“无按键”情况,恰好不太可能是 3000,但也许 if %elapsed% gtr 2980 echo no keypress 就足够了。

请注意,我使用hh:mm:ss.hh 的时间格式,因此如果您的时间格式不同,则需要调整time 子字符串。

由于这里的目标是大约 30 秒的超时,因此只能对秒数进行计算。这些值累积为1ss(.)hh,确保没有前导零,因此set /a 不会尝试进入octal 模式。由于结束时间完全有可能在下一分钟,所以加6000通过加分(6000几十毫秒)来补偿


由于似乎有必要构建整个批次,

@echo off

set /p username=ENTER LOGIN:

echo.

:pc

echo   1 -- Flats
echo   2 -- Simple Tabletop

set /P rmFunc="Enter a choice: "

:

for %%I in (1 x) do if #%rmFunc%==#%%I goto run%%I

:run1
set pc=300
goto begin

:run2
set pc=400
goto begin

:begin
set studio=TT
set computer=Handbag_1
set setnumber=
set studiosetnumber=%studio%_%setnumber%
set delay_swch=5
set delay_loop=30

:bottom

echo logged in as: %username%


SET /a "starttime=1%time:~-5,2%%time:~-2%"
timeout /t %delay_loop%
SET /a "endtime=1%time:~-5,2%%time:~-2%"
IF %endtime% lss %starttime% SET /a endtime +=6000
SET /a elapsed=endtime - starttime
if %elapsed% leq 2980 goto ???
GOTO BOTTOM

而且 - 好吧,我不得不离开它。您正在将 studiosetnumber 设置为代码中的常量。这些是否与“流程类”有关?如果你想重新输入这些数据,那么你需要上面的???begin - 但你需要set /p 这些值(你没有显示。) 至于文件扫描- 您的代码中没有任何地方显示此文件扫描正在发生。我指出的修改将允许您按任意键来中断 30 秒 bottom 循环并重新输入数据。

【讨论】:

  • 请允许我更清楚地说明这一点。我在照相馆工作,我们整天拍摄不同的产品。该脚本拾取文件并将它们移动到我们的备份中。我们检查质量然后继续。该脚本每 30 秒运行一次非扫描文件夹。每种产品都有不同的工艺等级。您在脚本开始时选择此类。现在您必须关闭脚本并重新启动以更改 Process 类。我需要能够更改进程类而不必关闭脚本,并且虽然它仍然继续,但它每 30 秒进行一次正常的文件夹扫描。如果我可以按一个键并重置,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多