使用批处理脚本将特定数量的文件复制到更改目录?

时间:2016-04-11 13:02:37

标签: batch-file

所以我正在尝试创建一个批处理脚本,从SD卡中获取照片并将其放在子目录中。然后我需要拍摄特定数量的照片(八张)并将它们放在一个单独的子目录中,然后拍摄下面的八张照片并将它们放在后续的子目录中。换句话说,我说有32张照片。我的脚本需要将它们复制到C:\ Photos中。然后我需要脚本拍摄前八张照片并将它们复制/粘贴到C:\ Photos \ 1中。然后我需要将接下来的八张照片复制/粘贴到C:\ Photos \ 2中,依此类推。

我已经知道如何将文件从一个目录复制到另一个目录(种类)。所有子目录文件夹都是在我的脚本中创建的。所以我有这段代码:

set cnt=0
set folder=1

for %%P in ("C:\Photos\") do (
    set /a cnt+=1
    if exist %%P\*.jpg COPY %%P\*.jpg C:\Photos\%folder%
    echo count = %cnt%
)

此代码的目标(好吧,我想要它做的)是,对于C:\ Photos目录中的每个文件,将一(1)个添加到cnt变量,并显示该cnt变量的值。问题是,代码的方式,它正确地复制文件,但不计算。它只计算一(1)个文件。但是,如果我将* .jpg添加到第一部分,就像这样

for %%P in ("C:\Photos\*.jpg") do (

计算适当数量的文件,但复制不起作用。是什么赋予了?

此外,由于出于调试目的,我希望它在计算/复制每个文件后回显当前计数。我的方式,计数似乎改变,但不会显示。

编辑:新问题。我的测试图像标记为img1,2,3等。当我运行代码时,它似乎以随机顺序通过它们。如果我运行32个文件,顺序如下:Img 1,3,13,8,7,6,5,4,2,11,12,14,15,16,18,19,29,9,10对于我来说,似乎很随机,每次运行脚本时顺序都是相同的。

1 个答案:

答案 0 :(得分:0)

SETLOCAL ENABLEDELAYEDEXPANSION
set cnt=0
set folder=1

for %%P in ("C:\Photos\*.jpg") do (
    set /a cnt+=1
    echo(COPY "%%P" C:\Photos\!folder!
    echo count = !cnt!
    SET /a switch=cnt %% 8
    IF !switch!==0 (set /a folder+=1)
)

第一个问题是使用setlocal enabledelayedexpansion,因为在代码块(带括号的系列命令)中,任何%var%在首次遇到块时被变量的内容替换< / strong> - 在delayedexpansion上看到关于SO的无穷无尽的项目。

使用delayedexpansion,而%var%引用原始值,!var!表示运行时值 - 当前值更改。

我建立了一个新变量switch,计算为count mod 8,因此在完成每组文件后它为零。解释!switch!,当它为零时,递增folder

请注意,%%P将包含从目录中读取的实际文件名,因此检查它是否存在没有实际意义 - 您需要做的只是copy到目的地。

为了测试目的,所需的COPY命令仅为ECHO在您确认命令正确后,将ECHO(COPY更改为COPY以实际复制文件。附加>nul以取消报告消息(例如1 file copied

以“名称”顺序修改转移

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set cnt=0
set folder=1
REM set "sourcedir=c:\photos"
SET "sourcedir=u:\sourcedir"

for /f "delims=" %%P in ('dir /b /on /a-d "%sourcedir%\*.jpg"') do (
    set /a cnt+=1
    ECHO(COPY "%sourcedir%\%%P" C:\Photos\!folder!
    echo count = !cnt!
    SET /a switch=cnt %% 8
    IF !switch!==0 (set /a folder+=1)
)

GOTO :EOF

测试报告:

COPY "u:\sourcedir\file 0.jpg" C:\Photos\1
count = 1
COPY "u:\sourcedir\file 1.jpg" C:\Photos\1
count = 2
COPY "u:\sourcedir\file 10.jpg" C:\Photos\1
count = 3
COPY "u:\sourcedir\file 11.jpg" C:\Photos\1
count = 4
COPY "u:\sourcedir\file 12.jpg" C:\Photos\1
count = 5
COPY "u:\sourcedir\file 13.jpg" C:\Photos\1
count = 6
COPY "u:\sourcedir\file 14.jpg" C:\Photos\1
count = 7
COPY "u:\sourcedir\file 15.jpg" C:\Photos\1
count = 8
COPY "u:\sourcedir\file 16.jpg" C:\Photos\2
count = 9
COPY "u:\sourcedir\file 17.jpg" C:\Photos\2
count = 10
COPY "u:\sourcedir\file 18.jpg" C:\Photos\2
count = 11
COPY "u:\sourcedir\file 19.jpg" C:\Photos\2
count = 12
COPY "u:\sourcedir\file 2.jpg" C:\Photos\2
count = 13
COPY "u:\sourcedir\file 20.jpg" C:\Photos\2
count = 14
COPY "u:\sourcedir\file 21.jpg" C:\Photos\2
count = 15
COPY "u:\sourcedir\file 22.jpg" C:\Photos\2
count = 16
COPY "u:\sourcedir\file 23.jpg" C:\Photos\3
count = 17
COPY "u:\sourcedir\file 24.jpg" C:\Photos\3
count = 18
COPY "u:\sourcedir\file 25.jpg" C:\Photos\3
count = 19
COPY "u:\sourcedir\file 3.jpg" C:\Photos\3
count = 20
COPY "u:\sourcedir\file 4.jpg" C:\Photos\3
count = 21
COPY "u:\sourcedir\file 5.jpg" C:\Photos\3
count = 22
COPY "u:\sourcedir\file 6.jpg" C:\Photos\3
count = 23
COPY "u:\sourcedir\file 7.jpg" C:\Photos\3
count = 24
COPY "u:\sourcedir\file 8.jpg" C:\Photos\4
count = 25
COPY "u:\sourcedir\file 9.jpg" C:\Photos\4
count = 26

“秩序”的问题值得商榷。您似乎正在从SD卡读取,该SD卡按照在目录中输入的顺序报告文件。您可以在名称序列中订购文件(这是/o:n子命令中dir的含义),但这是严格按字母顺序排列的 - 如图所示。按照数值部分的值顺序排列序列是可能的,但这将是相当多的工作。

您还可以将/o:n更改为/o:d,这会将odering更改为datestamp-order,这可能更接近您想要的。