BATch文件:在数组中循环,如何使用数组中的字符串?

时间:2016-12-02 18:10:36

标签: arrays loops batch-file

我的任务是创建一个脚本,将文件夹中的日期子文件夹复制到另一个位置。基本文件夹命名为16个十六进制字符,每个文件夹都有一个年份的文件夹,在月份的文件夹中,在里面有一个日期的文件夹,其中包含我需要复制的二进制(转储)文件。我关心的两个月大约有50个文件夹大约5天(现在),所以我想要捕获如下内容: C:\ DUMPS \ 2401010153783FB6 \ 2016 \ 09 \ 29 * *

而不是做大量的copypaste脚本或手动尝试获取我想要的所有文件夹(人为容易出错),我想我应该能够创建一个BAT文件来循环遍历文件夹名称数组并获取我关心的文件。我在以下用户DSS的答案中找到了一个非常有用的部分: How to loop through array in batch?

我的问题是他的示例显示了如何使用CALL ECHO而不仅仅是ECHO,但我想将字符串值用作文件夹名称的一部分,而不仅仅是打印到控制台。这是我开发的正在进行中的代码:

SET COPYPATH=C:\Dumps
SET DESTPATH=D:\NewDumps
SET FOLDERNAME[0]=2401010153783FB6
SET FOLDERNAME[1]=2401010753BBBBCE
SET "X=0"

:Looping
IF DEFINED FOLDERNAME[%X%] (
    CALL ECHO %%FOLDERNAME[%X%]%% REM Works great, I see the value of FOLDERNAME[0] on console.
    SET TEMPVAR= CALL ECHO %%FOLDERNAME[%X%]%% REM No good! Result is CALL ECHO.
    SET TEMPVAR= CALL %%FOLDERNAME[%X%]%% REM No good! Result is CALL X.
    SET TEMPVAR= %FOLDERNAME[%X%]% REM No good! Result is literal FOLDERNAME[0]; I want the value of FOLDERNAME[0].
    IF EXIST %TEMPVAR%\2016\09\28 (
        COPY %TEMPVAR%\2016\09\28 %DESTPATH%\%FOLDERNAME[%X%]%%\2016\09\28
    )
    IF EXIST %COPYPATH%\%FOLDERNAME%\2016\09\29 (
        COPY %COPYPATH%\%FOLDERNAME%\2016\09\29 %DESTPATH%\%FOLDERNAME%\2016\09\29
    )
    IF EXIST %COPYPATH%\%FOLDERNAME%\2016\09\30 (
        COPY %COPYPATH%\%FOLDERNAME%\2016\09\30 %DESTPATH%\%FOLDERNAME%\2016\09\30
    )
    IF EXIST %COPYPATH%\%FOLDERNAME%\2016\10\01 (
        COPY %COPYPATH%\%FOLDERNAME%\2016\10\01 %DESTPATH%\%FOLDERNAME%\2016\10\01
    )
    IF EXIST %COPYPATH%\%FOLDERNAME%\2016\10\02 (
        COPY %COPYPATH%\%FOLDERNAME%\2016\10\02 %DESTPATH%\%FOLDERNAME%\2016\10\02
    )
    SET /A "X+=1"
    GOTO :Looping
)

我可以在任一路径中使用临时变量,或者我可以使用连接的%COPYPATH%\%FOLDERNAME%语法(当我将其设置为一次性测试时有效,但现在我想要循环它50次)。任何建议都非常感谢!

3 个答案:

答案 0 :(得分:0)

怎么样

for /L %%a in (0,1,1) do (
 for %%b in (2016) do (
  for %%c in ("09 28" "09 29" "09 30" "10 01" "10 02") do (
   call :sub %%a %%b %%~c
  )
 )
)
...whatever, etc...
goto :eof

:sub
call set "foldername=%%foldername[%1]%%"
IF EXIST %COPYPATH%\%FOLDERNAME%\%2\%3\%4 (
 echo   COPY %COPYPATH%\%FOLDERNAME%\%2\%3\%4 %DESTPATH%\%FOLDERNAME%\%2\%3\%4
)
goto :eof

其中echo用于显示建议的内容,请删除要执行的echo关键字。

请注意,您没有解释为什么要在代码中从tempname切换到copypath\foldername,因此我认为它的替换不完整。

答案 1 :(得分:0)

怎么样......

@echo off
setlocal enabledelayedexpansion

SET "COPYPATH=C:\Dumps"
SET "DESTPATH=D:\NewDumps"
SET "FOLDERNAME[0]=2401010153783FB6"
SET "FOLDERNAME[1]=2401010753BBBBCE"
rem set start to first item index, stop to last 
SET/a start=0, stop=1 


SET "DAYS=2016\09\28,2016\09\30,2016\10\01"


for /L %%i in (%start%,1,%stop%) do (
  echo !FOLDERNAME[%%i]!
  set "TEMPVAR=%COPYPATH%\!FOLDERNAME[%%i]!"
  set "DESTVAR=%DESTPATH%\!FOLDERNAME[%%i]!"
  for %%d in (%DAYS%) do (
    rem if it works, remove echo from line below
    IF EXIST "!TEMPVAR!\%%d" echo COPY "!TEMPVAR!\%%d" "!DESTPATH!\%%d"
  )

)

exit /B

答案 2 :(得分:0)

我想你所有人:

SET TEMPVAR=....

试图将命令的结果保存到变量中 好吧,我不得不让你失望......没有可能(还)将命令的结果直接分配给可靠的批处理(对不起)。存在间接方式:for /f - 循环,使用临时文件,......但它们可能会使您的代码更复杂 您正在寻找的命令是

call set tempvar=%%foldername[%x%]%%

call用于执行您在批处理文件中作为参数给出的命令。 所以命令看起来像(假设x=0set tempvar=%foldername[0]%,调用将执行该命令(如果x=0偏离...)。

祝你好运!

PS:如果您考虑使用延迟扩展,请考虑@Magoo's answer改进批处理脚本和@elzooilogico