Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当满足if条件时,我们需要传递ctrl+;在shell脚本中停止当前项并启动下一项?_Shell_Batch File - Fatal编程技术网

当满足if条件时,我们需要传递ctrl+;在shell脚本中停止当前项并启动下一项?

当满足if条件时,我们需要传递ctrl+;在shell脚本中停止当前项并启动下一项?,shell,batch-file,Shell,Batch File,我面临的真实情况如下: 我有一个bat文件来根据上次修改的时间监控上次更新的文件,它会告诉用户文件在过去1分钟内是否没有更新 2.但我的情况是,我们使用上次修改的bat文件来监视日志文件更新。如果日志文件在最近1分钟内未更新,则脚本必须通过脚本本身发送Ctrl+C以停止当前测试 当前,当文件在1分钟内未更新时,我们将手动执行Ctrl+C,然后系统将询问我们是否需要退出?我们将说不,然后它将继续下一个测试套件 目前,我有脚本来监控基于上次修改日期和时间的日志文件更新。但是我需要自动化我在3中提供的

我面临的真实情况如下:

  • 我有一个bat文件来根据上次修改的时间监控上次更新的文件,它会告诉用户文件在过去1分钟内是否没有更新

    2.但我的情况是,我们使用上次修改的bat文件来监视日志文件更新。如果日志文件在最近1分钟内未更新,则脚本必须通过脚本本身发送Ctrl+C以停止当前测试

  • 当前,当文件在1分钟内未更新时,我们将手动执行Ctrl+C,然后系统将询问我们是否需要退出?我们将说不,然后它将继续下一个测试套件

    目前,我有脚本来监控基于上次修改日期和时间的日志文件更新。但是我需要自动化我在3中提供的步骤

    要查看上次修改的文件,请参考以下内容:

  • 复制下面的文件并将其另存为.bat文件,名称为checkfolder

    @echo off
    :: Wmic removes regional differences
    :: XP Pro can have some filename errors due to the short filename bug
    
    setlocal
    :: set the number of minutes in the following line
    set minutes=1
    
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
    set "stamp=%YYYY% %MM% %DD% %HH% %Min%"
    call :DateToMinutes %stamp% NowMins
    
    set "name="
    for /f "delims=" %%a in ('dir * /a-d /b /od ^|find /v /i "%~nx0"') do set "name=%%a"
    if defined name call :CheckMins "%name%"
    if %MinsOld% gtr %minutes% echo Folder hasn't been modified in %minutes% minutes & pause
    
    goto :EOF
    
    :CheckMins
    set "filestamp="
    set "filemins="
    set "MinsOld="
    set "YY=" & set "YYYY=" & set "MM=" & set "DD="
    set "HH=" & set "Min=" & set "Sec=" & set "dt="
    set "file=%~sf1"
    :: can use CreationDate instead of lastmodified
    WMIC DATAFILE WHERE name="%file:\=\\%" get lastmodified | find "." >test.txt
    for /f %%a in (rh5.log) do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
    set "filestamp=%YYYY% %MM% %DD% %HH% %Min%"
    del test.txt 2>nul
    if not defined yyyy goto :EOF
    
    call :DateToMinutes %filestamp% FileMins
    set /a MinsOld=%NowMins%-%FileMins%
    goto :EOF
    
    :DateToMinutes
    setlocal
    set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5
    if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
    set /a dd=100%dd%%%100,mm=100%mm%%%100
    set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
    set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
    if 1%hh% LSS 20 set hh=0%hh%
    if /i {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
    if /i {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
    if /i {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
    set /a hh=100%hh%%%100,nn=100%nn%%%100,j=j*1440+hh*60+nn
    endlocal&set %6=%j%&goto :EOF
    
    复制下面的文件并将其另存为filechecker.bat

    @echo off
    :loop
    call "checkfolder.bat"
    timeout /t 60 /nobreak
    goto :loop
    
    然后创建名为test.txt的txt文件。将这三个文件放在同一个文件夹中,然后单击checkfolder.bat进行验证

    我的问题是,

    在这里,我得到的响应是file not modified,之后我需要通过脚本传递ctrl+c,我必须将值传递为'n'并点击enter

    如果(文件未更新) ctrl+c,然后提供n作为输入以启动下一个套件

    请帮我解决这个问题。

    请参见

    此外,您可以使用批处理和vb混合发送关键点到任何您想要的窗口。。。在此示例中,键被发送到当前
    cmd
    窗口。您可能需要调整计时,以避免在
    Ctrl+C
    s

    @echo off
    
    for /L %%a in (1,1,100) do (
      echo(Test waiting for Ctrl+C, loop %%a
      ping 1.1.1.1 -w 500 -n 1 > NUL
      if %%a equ 6 call :sendCTRLC_WAIT
    )
    
    echo(This is never reached.
    exit/B
    
    
    rem wait for a second until ctrl-c is sent to this cmd session
    :sendCTRLC_WAIT
    SetLocal
    set "_file1_=%TEMP%\after.vbs"
    set "_file2_=%TEMP%\ctrlc.vbs"
    >"%_file1_%" (
      echo(wScript.Sleep 1300
      echo(set oWS = CreateObject("wScript.Shell"^)
      echo(oWS.SendKeys "s"
      echo(wScript.Sleep 50
      echo(oWS.SendKeys "{ENTER}"
    )
    >"%_file2_%" (
      echo(wScript.Sleep 1000  
      echo(set oWS = CreateObject("wScript.Shell"^)
      echo(oWS.SendKeys "^{c}"
    )
    start /B cmd /C ""%_file1_%"" & rem del /F /Q "%_file1_%" 2>NUL"
    start /B cmd /C ""%_file2_%"" & rem del /F /Q "%_file2_%" 2>NUL"
    exit/B 0
    
    
    :sendCTRLC_TESTED
    SetLocal
    set "_file1_=%TEMP%\after.vbs"
    set "_file2_=%TEMP%\ctrlc.vbs"
    >"%_file1_%" (
      echo(wScript.Sleep 300
      echo(set oWS = CreateObject("wScript.Shell"^)
      echo(oWS.SendKeys "s"
      echo(wScript.Sleep 50
      echo(oWS.SendKeys "{ENTER}"
    )
    >"%_file2_%" (
      echo(set oWS = CreateObject("wScript.Shell"^)
      echo(oWS.SendKeys "^{c}"
    )
    start /B cmd /C ""%_file1_%"" & rem del /F /Q "%_file1_%" 2>NUL"
    start /B cmd /C ""%_file2_%"" & rem del /F /Q "%_file2_%" 2>NUL"
    exit/B 0
    

    “批处理”,而不是“bash”,是吗?我还以为是linux…是的…是批处理文件…看到了吗