Windows批处理脚本一次压缩文件夹中的文件500个文件

时间:2018-02-14 17:15:29

标签: windows batch-file

我的问题:我们每天通过FTP传输将我们的通话录音作为一个zip文件发送给第三方供应商,以提供他们提供的分析服务。这个过程通过.bat文件自动进行了很长时间,直到转移开始失败为止。

我们的供应商建议将一个大型zip文件分成几个较小的文件以解决问题。

因此,目标是编写一个.bat文件,该文件将一次获取500个录制文件并压缩它们。 显然,脚本还必须压缩最后留下的随机数量的文件

我花了5天的时间在线研究这个问题,我发现在堆栈交换上发布的解决方案似乎正是我需要的。

但是,我无法让它发挥作用,并希望在确定需要修改哪些内容以帮助其正确执行方面提供一些帮助。

以下是目前形式的脚本:

@echo off
Setlocal EnableDelayedExpansion

:: Folder containing files
set input=C:\Temp\CallMiner\Downloads
:: Folder for zips
set output=C:\Temp\CallMiner\Uploads
:: Temp filename to hold list of 500 
set listfile=%temp%\listfile
:: Zip counter
set z=1
:: Files per zip
set n=500

cd /d %input%

if exist %listfile% del %listfile%

set i=0

for %f in (*) do (
    echo [!i!] & set /a i+=1
    echo %f >> %listfile%

    if !i!==%n% (
        7z a %output%\!z!.zip @%listfile%
        set i=0
        set /a !z!+=1
        del %listfile%
    )
)

:: Process remaining files, if any
if exist %listfile% (
    7z a %output%\!z!.zip @%listfile%
    del %listfile%
)

这是发布的原始脚本,用于回答具有类似问题的其他用户:

@echo off
Setlocal EnableDelayedExpansion

:: Folder containing files
set input=D:\temp
:: Folder for zips
set output=D:\output
:: Temp filename to hold list of 10 
set listfile=%temp%\listfile
:: Zip counter
set z=1
:: Files per zip
set n=10

cd /d %input%

if exist %listfile% del %listfile%

set i=0

for %%f in (*.*) do (
    set /a i=!i! + 1
    echo %%f >> %listfile%

    if !i!==%n% (
        rar a %output%\!z!.rar @%listfile%
        set i=0
        set /a z=!z! + 1
        del %listfile%
    )
)

:: Process remaining files, if any
if exist %listfile% (
    rar a %output%\!z!.rar @%listfile%
    del %listfile%
)

当我执行仅修改了文件位置,数量,zip程序和删除单个%符号的原始脚本以便我可以手动执行并观察结果时,我反复收到错误“遗失操作符”(大概一次)对于文件夹中的每个文件)。据我所知,该错误引用了这行代码:

set /a i=!i! + 1

我对它所做的每一次修改都会产生不同的结果,但都不是正确的。

我不能肯定地说这是问题的真正原因,或唯一的问题,我真的很感谢来自更有经验的Windows命令行用户的一些帮助。

2 个答案:

答案 0 :(得分:1)

您的问题似乎在这里:

for %f in (*) do (
    echo [!i!] & set /a i+=1
    echo %f >> %listfile%

    if !i!==%n% (
        7z a %output%\!z!.zip @%listfile%
        set i=0
        set /a z+=1
        del %listfile%
    )
)

批处理文件中的for循环要求metavariable(在这种情况下为f)指定为%%f

在代码的这一部分中将%f替换为%%f,所有内容都应该有效。

移除(或注释掉)@echo off行将为您提供逐个扫描的痕迹。您可以使用 ctrl s (同时)停止跟踪(暂时),然后再次重启。或添加PAUSE语句。

答案 1 :(得分:0)

好的,我明白了。有两件事是坚持下去的。首先,我修改了" if"声明反映了我对" for"所做的改变。语句:

for %%f in (*.vox) do (
echo [!i!] & set /a i+=1
echo %%f >> %listfile%

if !i!==%n% (
    7z a %output%\!z!.zip @%listfile%
    set i=0
    echo [!z!] & set /a z+=1
    del %listfile%
)
)

其次,我不得不重新定位7zip的7z.exe文件。我已经遵循了将其添加到用户配置文件以避免问题的建议。这不起作用。我不得不将它直接添加到要压缩文件所在的源文件夹中。幸运的是,我只需要从该文件夹中压缩一种文件类型,因此对于我来说,这是一个非问题。