批处理:可在计数循环中使用的变量定义

时间:2015-08-06 10:01:15

标签: variables batch-file delayedvariableexpansion

在我的批处理中,我想复制可变数量的源到目标目的地。

我想这样定义:

@setlocal EnableDelayedExpansion

set source1="C:\folder1"
set target1="f:\folder1"

set source2="C:\folder2" 
set target2="f:\folder2"  
...

set sourcen="C:\foldern" 
set targetn="f:\foldern"

依赖于定义数量的文件夹

set numFolder=5

我想循环浏览文件夹:

set /a COUNT=0

:LOOP
echo %COUNT%
set /a COUNT+=1

rem write the NAME of the parameter variable (source1,source2 etc.) in nameor 
set "nameor=source%COUNT%"
rem write the VALUE of the parameter variable (source1,source2 etc.) into origin ("C:\folder1", "C:\folder2")
set "origin=%nameor%"
echo %origin%

if %COUNT% lss %numFolder% goto LOOP

当我表演时

echo %nameor%

我得到了我的预期:source1,source2等。 但是

echo %%%origin%%%

仅提供

  

source1中

而不是预期值

  

“C:\ folder1”

我想,我可以通过使用DelayedExpansion解决这个问题,但我错过了什么?

2 个答案:

答案 0 :(得分:1)

为了避免让我感到困惑,我改变了"起源"来源"来源"。例如。 set "origin=%nameor%"已更改为set "source=%nameor%"

要打印出来" C:\ folder1"到" C:\ foldern",你应该使用echo !%source%!,否则你只会看到" source1" to" sourcen"。

答案 1 :(得分:0)

您的问题只是数组元素管理。试试这个:

@echo off
setlocal EnableDelayedExpansion

rem Define the two arrays
set i=0
for %%a in ("C:\folder1=f:\folder1"
            "C:\folder2=f:\folder2"
            "C:\foldern=f:\foldern") do (
   set /A i+=1
   for /F "tokens=1,2 delims==" %%b in (%%a) do (
      set source!i!="%%a"
      set target!i!="%%b"
   )
)

rem Show up to numFolder elements of both arrays
set numFolder=5
for /L %%i in (1,1,%numFolder%) do (
   echo %%i- Source%%i=!source%%i!,  Target%%i=!target%%i!
)

第一部分相当于您的一系列单个元素分配。这样就可以更容易地添加新的值对。

有关批处理文件中阵列管理的进一步说明,请参阅:Arrays, linked lists and other data structures in cmd.exe (batch) script