【问题标题】:Batch File Range批处理文件范围
【发布时间】:2014-09-18 05:11:23
【问题描述】:

在此先感谢您的帮助!我有一个批处理文件问题要问你们。所以我们跟上我们客户的备份之一。它们距离我们 200 多英里。我们通过远程桌面带来他们的备份。我们发现通过命令提示符使用复制功能比任何其他复制/粘贴方法都要快得多。负责带他们过来的人经常忘记这样做。我刚刚开始使用批处理,但是我创建了一个小批处理程序,它会询问用户要带入哪个文件,这样他就不必“复制 n:\backups\blah \tsclient\h\backups\blah”这很容易出错。以下是批处理文件:

@echo off
title Copy Zipbacks

:loopagain
set /p date=Enter the date that needs to be copied over (yyyymmdd format):
copy h:\zipbackups\daily%date%.zipx \\tsclient\h\benton_off_site_backup\zipbackups

set /p again=Copy Another Daily Zip file? (Y/N):

IF "%again%"=="Y" GOTO loopAgain
IF "%again%"=="N" GOTO goAway

:goAway
exit

如果只有少数备份需要带过来,这很好。我的问题是这个;有没有办法带来一系列备份?文件设置如下:

dailyYYYYMMDD.zipx
i.e. daily20140917.zipx

我没有问题询问日期范围,但是让 .bat 循环浏览文件夹并仅获取符合条件的那些是我遇到问题的地方。有什么想法吗?

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    您可以使用for 枚举文件:

    @echo off
    title Copy Zipbacks
    
    :loopagain
    set /p start_date=Enter start date that needs to be copied over (yyyymmdd format):
    set /p end_date=Enter end date (yyyymmdd format) or nothing to match only start date:
    if not defined end_date set end_date=%start_date%
    for %%f in (h:\zipbackups\daily*.zipx) do if "%%~nf" geq "daily%start_date%" if "%%~nf" leq "daily%end_date%" copy %%f \\tsclient\h\benton_off_site_backup\zipbackups
    
    set /p again=Copy Another Daily Zip file? (Y/N):
    
    IF "%again%"=="Y" GOTO loopAgain
    IF "%again%"=="N" GOTO goAway
    
    :goAway
    exit
    

    【讨论】:

    • 这是一个比我更好的解决方案。也许使用choice /c YN /m "Copy Another Daily Zip file?" 而不是set /p 会更好。然后检查变成IF %ERRORLEVEL%==2 GOTO goAwayIF %ERRORLEVEL%==1 GOTO loopAgain。一般来说,当脚本开始从其他地方调用时,将出口放入脚本会出现问题,最好不要这样做。
    • @LS_dev,感谢您的意见!我真的很感谢你的帮助。所以只需添加几个if statements?这超级容易!不过我有一个问题要问你。 "%%~nf" 是做什么的?
    • @Jim,当我第一次开始编写原始脚本时,我尽力让choice 工作,无论我输入Y 还是N,它总是会重复第一个ERRORLEVEL . 我会再试一次,因为我不会让它轻易击败我
    • @Jim 我只是添加了必需的功能,没有更改现有代码。
    • @MichaelHarvey %%~nfreturns 只返回路径中的名称部分。检查for /?
    【解决方案2】:

    我遇到了一个使用 xcopy 的技巧,它可以让您生成一系列有效日期。以下脚本将生成序列,然后复制每个文件。

    @echo off
    
    ::set /p date=Enter the start date that needs to be copied over (yyyymmdd format):
    ::set /p end=Enter the end date that needs to be copied over (yyyymmdd format):
    set /a date=20010218
    set /a end=20010302
    
    set /a y=%date:~0,4%
    set /a m=%date:~4,2%
    set /a d=%date:~6,2%
    echo INPUT = %y% %m% %d%
    
    :getnextvaliddate
       set /a d+=1
    
       if %d% gtr 31 (
          set d=1
          set /a m+=1
    
          if %m% gtr 12 (
             set m=1
             set /a y+=1
          )
       )
    
    echo %y% %m% %d%
    
    xcopy /d:%m%-%d%-%y% /h /l "%~f0" "%~f0\" >nul 2>&1 || goto getnextvaliddate
    
    call :prettydate
    
    if %y% equ %end:~0,4% (
      if %m% equ %end:~4,2% (
        if %d% equ %end:~6,2% (
          goto :EOF
        )
      )
    )
    
    goto :getnextvaliddate
    
    :prettydate
    if %d% lss 10 (
      set dd=0%d%
    ) else (
      set dd=%d%
    )
    if %m% lss 10 (
      set mm=0%m%
    ) else (
      set mm=%m%
    )
    echo copy h:\zipbackups\daily%y%%mm%%dd%.zipx \\tsclient\h\benton_off_site_backup\zipbackups
    goto :EOF
    

    我的机器上的输出:

    INPUT = 2001 2 26
    2001 2 27
    copy h:\zipbackups\daily20010227.zipx \\tsclient\h\benton_off_site_backup\zipbackups
    2001 2 28
    copy h:\zipbackups\daily20010228.zipx \\tsclient\h\benton_off_site_backup\zipbackups
    2001 2 29
    2001 2 30
    2001 2 31
    2001 3 1
    copy h:\zipbackups\daily20010301.zipx \\tsclient\h\benton_off_site_backup\zipbackups
    2001 3 2
    copy h:\zipbackups\daily20010302.zipx \\tsclient\h\benton_off_site_backup\zipbackups
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多