批处理:计数循环中可用的变量定义
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
在我的批次中,我想将可变数量的源复制到目标位置。
我想这样定义:
@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