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

Batch: variable definition useable in count loop

在我的批次中,我想将可变数量的源复制到目标位置。

我想这样定义:

@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 来解决这个问题,但我错过了什么?

为了避免混淆,我将 "origin" 更改为 "source"。例如。 set "origin=%nameor%" 改为 set "source=%nameor%".

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

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

@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