【问题标题】:MID function for Batch file批处理文件的 MID 函数
【发布时间】:2014-11-16 21:27:15
【问题描述】:

我带着一个批处理文件问题回来了。我向this 询问了有关在批处理文件中获取范围的问题,以便我们可以更轻松地进行备份。将文件复制到我们的系统后,我们会解压缩文件,以便我们对客户的数据进行“运行备份”。我现在要完成的是将刚刚解压缩的文件从其当前目录移动到存档目录。到目前为止,我有以下内容:

@echo off
FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\
move H:\benton_off_site_backup\zipbackups\%%i H:\benton_off_site_backup\zipbackups\AlreadyUnzipped
)
exit

这很好,但AlreadyUnzipped 文件夹包含按年份标记的子文件夹。年文件夹有按月标记的子文件夹。

i.e. H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\2014\1.January
     H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\2014\2.February
     ...

这些文件夹包含已解压缩的所有内容。我想要发生的是,一旦解压缩过程完成,我希望将文件移动到相应的存档文件夹中。一个例子是:

daily20140105.zipx

需要去

H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\2014\1.January

我在网上做了一些研究,找到了this 网站,但一直没有发生任何事情。我一直在做 MID 等价物。如果我需要进一步解释自己,那么我很乐意这样做。提前致谢!

更新

非常感谢@David Ruhmann 的帮助!他让我走到了这一步

setlocal EnableDelayedExpansion
set "count=0"
for %%A in (January February March April May June July August September October November December) do set /a "count+=1" & set "month[!count!]=%%A"

FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\

set "filename=%%~ni"
set "mm=!filename:~-4,2!"
if "!filename:~-4,1!"=="0" set "mm=!filename:~-3,1!"
call move H:\benton_off_site_backup\zipbackups\%%~i H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!filename:~-8,4!\!mm!.%%month[!mm!]%%\%%i

当我调试它时,以下内容被回显出来。

move H:\benton_off_site_backup\zipbackups\daily20140920.zipx
H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\2014\9.September\daily20140920.zipx

路径是正确的,但它什么也没做!它只提取文件,然后说系统找不到路径并移动到下一个要提取的文件。 GRRRR!

完成:

我非常感谢@DavidRuhmann 和@Magoo。如果没有他们的帮助和敏锐的洞察力,我会在寻找答案的过程中陷入困境。我已经将他们的两个输入都用于我的最终程序,如下所示:

@echo off

setlocal EnableDelayedExpansion
set "count=0"
for %%A in (January February March April May June July August September October November December) do set /a "count+=1" & set "month[!count!]=%%A"

FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
 c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\

 set "filename=%%~ni"
 set "mm=!filename:~-4,2!"
 if "!filename:~-4,1!"=="0" set "mm=!filename:~-3,1!"
 CALL SET "monthdir=!filename:~-8,4!\!mm!.%%month[!mm!]%%"
 MD H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir! 2>NUL
 call move H:\benton_off_site_backup\zipbackups\%%~i H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir!\%%i

)
endlocal
exit

如果您仍在阅读本文,请为这些人的贡献点赞,给他们一些爱。再次感谢!

【问题讨论】:

    标签: windows batch-file batch-processing


    【解决方案1】:

    仅解决现在遇到的错误 - 这纯粹是“空中代码”(理论且未经测试)

    (还要注意for 有一个未闭合的括号 - 可能是剪切粘贴故障)

    FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
     c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\
    
     set "filename=%%~ni"
     set "mm=!filename:~-4,2!"
     if "!filename:~-4,1!"=="0" set "mm=!filename:~-3,1!"
     SET "monthdir=!filename:~-8,4!\!mm!.%month[!mm!]%"
     echo(MD H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir!
     ECHO(move H:\benton_off_site_backup\zipbackups\%%~i H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir!\%%i\
    )
    

    所需的 MD 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(MD 更改为MD 以实际创建目录。附加 2>nul 以抑制错误消息(例如,当目录已存在时)

    所需的 MOVE 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(MOVE 更改为MOVE 以实际移动文件。附加>nul 以禁止报告消息(例如1 file moved


    进一步的想法:

    当然,扩展有问题。

     CALL SET "monthdir=!filename:~-8,4!\!mm!.%%month[!mm!]%%"
    

    应该可以。对我有用。

    同时 - echoed 的两条线:

    现有目录的额外MD 不会造成任何伤害。如果您愿意,可以将其称为安全措施;如果你喜欢,可以省略它。正如我所记录的,如果您删除 echo( 并附加 2>nul,则为现有目录生成的错误消息将被禁止。

    最后,我认为“找不到文件”消息的原因可能是 move 命令中的终端 \ - 我的印象是目标是目录规范,而不是文件规范,因此应省略终端\

    修改批次段:

    FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
     c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\
    
     set "filename=%%~ni"
     set "mm=!filename:~-4,2!"
     if "!filename:~-4,1!"=="0" set "mm=!filename:~-3,1!"
     CALL SET "monthdir=!filename:~-8,4!\!mm!.%%month[!mm!]%%"
     echo(MD H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir!
     ECHO(move H:\benton_off_site_backup\zipbackups\%%~i H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!monthdir!\%%i
    )
    

    【讨论】:

    • 文件夹结构已经创建。 MD 不会每次都重新创建文件夹吗?如果没有,那么我会迷失为什么它不会。如果不会,你能解释为什么不会吗?
    • @MichaelHarvey md 命令只会在目录不存在时创建新目录。如果该目录已经存在,那么它将输出消息A subdirectory or file <item> already exists. 因此,尽可能多地调用md 命令并没有什么坏处。
    • @Magoo 我认为monthdir 扩展不能正常工作,因为%month[!mm!]% 将在!mm! 之前扩展。这就是我使用call%% 方法的原因。此外,move 命令的结尾在目标文件名%%i 之后有一个额外的反斜杠。
    • @DavidRuhmann,你是完全正确的。我不知道如何解释发生了什么,但显然你知道。我一直收到%9.month[9]%,但当我删除回声时,我仍然收到can't find the folder
    【解决方案2】:

    这样的事情应该可以满足您的要求。

    @echo off
    
    setlocal EnableDelayedExpansion
    set "count=0"
    for %%A in (January February March April May June July August September October November December) do set /a "count+=1" & set "month[!count!]=%%A"
    
    FOR /F %%i IN (H:\benton_off_site_backup\zipbackups\ZipBackupsList.txt) DO (
    c:\wzzip\wzunzip -o -d H:\benton_off_site_backup\zipbackups\%%i h:\benton_off_site_backup\
    
    set "filename=%%~ni"
    set "mm=!filename:~-4,2!"
    if "!filename:~-4,1!"=="0" set "mm=!filename:~-3,1!"
    call move "H:\benton_off_site_backup\zipbackups\%%~i" "H:\benton_off_site_backup\zipbackups\AlreadyUnzipped\!filename:~-8,4!\!mm!.%%month[!mm!]%%\%%~i"
    
    )
    endlocal
    exit
    

    【讨论】:

    • 所以我运行了这个,但我不完全确定它做了什么。我会尽力解释它做了什么。它确实解压缩了文件,但之后文件没有移动到相应的存档文件夹。批处理完成后,在同一目录中创建了一个名为 AlreadyUnzipped 的新文件。我最好的猜测是,也许 zip 文件被移动到了 AlreadyUnzipped 文件中。感谢您的意见。
    • @MichaelHarvey 将@echo off 更改为@echo on 并在call move 命令之间添加echo (call echo move) 并将exit 更改为pause 以调试脚本.另外,AlreadyUnzipped 和子文件夹是否存在或是否需要创建?
    • 感谢您的快速回复!我肯定会做一些调试。 AlreadyUnzipped 子文件夹已经存在。
    • @MichaelHarvey 很高兴尝试提供帮助,很抱歉我不知道解决方案,但如果您可以发布echo 的结果,我可能会得到更好地了解故障点。这可能是我的更改中的一个疏忽,或者是我从头脑中写下我的答案时错过了一些未处理的场景。 :)
    • 是的,冒号是必需的。当我回到电脑时,我会编辑我的答案。月份逻辑也一定有问题。稍后也会再看一遍。感谢调试。
    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多