Windows 为批处理文件中的两个不同数组创建两个for循环
我正在处理带有数组和for循环的批处理文件 这是一个在“Compo”的帮助下正常工作的程序,现在我想进一步扩展它,但我无法这样做 有不同的IP和不同的IP我想有不同的目的地复制文件Windows 为批处理文件中的两个不同数组创建两个for循环,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在处理带有数组和for循环的批处理文件 这是一个在“Compo”的帮助下正常工作的程序,现在我想进一步扩展它,但我无法这样做 有不同的IP和不同的IP我想有不同的目的地复制文件 Rem Define your IP list Set "obj[0]=192.168.170.239" Set "obj[1]=192.168.170.240" Set "obj[2]=192.168.170.241" Set "obj[3]=192.168.170.242" 我为目标文件夹又创建了一个数组 Re
Rem Define your IP list
Set "obj[0]=192.168.170.239"
Set "obj[1]=192.168.170.240"
Set "obj[2]=192.168.170.241"
Set "obj[3]=192.168.170.242"
我为目标文件夹又创建了一个数组
Rem Define your destination folder
Set "fol[0]=R1"
Set "fol[1]=R2"
Set "fol[2]=R3"
Set "fol[3]=R4"
我的问题是如何将循环中的Set“destination=D:\Autobackup\”更改为Set“destination=D:\Autobackup\R1”
我在循环内部尝试了以下循环,但我不希望它是这样。我只想迭代一次
@Echo Off
Rem Undefine any existing variables beginning with obj[
For /F "Delims==" %%A In ('Set obj[ 2^>Nul') Do Set "%%A="
Rem Define your IP list
Set "obj[0]=192.168.170.239"
Set "obj[1]=192.168.170.240"
Set "obj[2]=192.168.170.241"
Set "obj[3]=192.168.170.242"
Rem Define your destination folder
Set "fol[0]=R1"
Set "fol[1]=R2"
Set "fol[2]=R3"
Set "fol[3]=R4"
Rem Define your Map Source and Destination
Set "map=T:"
Set "source=%map%\Autobackup"
Set "destination=D:\Autobackup\"
Rem Loop through the IP list
For /F "Tokens=1* Delims==" %%A In ('Set obj[ 2^>Nul') Do (
For /F "Tokens=1* Delims==" %%C In ('Set fol[ 2^>Nul') Do (
Rem Make sure that %map% is not currently mapped
Net Use %map% /Delete 2>Nul
Rem Map the share
Net Use %map% \\%%B\D /User:User1 Password
Rem Perform the required operation
XCopy "%source%" "%destination%%%D" /Y
Rem Delete the mapped share
Net Use %map% /Delete
)
)
我还想打印循环值 你的意思是这样的吗
@Echo关闭
SetLocal EnableDelayedExpansion
Rem定义您的IP列表
设置“obj[0]=192.168.170.239”
设置“obj[1]=192.168.170.240”
设置“obj[2]=192.168.170.241”
设置“obj[3]=192.168.170.242”
Rem定义文件夹列表
设置“fol[0]=R1”
设置“fol[1]=R2”
设置“fol[2]=R3”
设置“fol[3]=R4”
Rem定义地图、来源和目的地
设置“map=T:”
设置“源=%map%\Autobackup”
设置“目的地=D:\Autobackup\”
Rem请确保当前未映射%map%
净使用%map%/删除2>Nul
Rem循环通过每个伪数组项0-3
对于(0,1,3)Do中的/L%%A(
Rem映射共享
Net使用%map%\\!obj[%%A]!\D/用户:用户1密码
Rem执行所需的操作
XCopy“%source%”%destination%%!fol[%A]!\”/Y
Rem删除映射的共享
净使用%map%/删除
)
有关其用法信息,请参见For/?
,特别请参阅For/L
部分
您也可以使用与原始结构相同的For/F
结构,但在设置变量时将IP地址的最后八位字节与文件夹名称链接:
@Echo关闭
Rem定义变量单
设置“map=T:”
设置“源=%map%\Autobackup”
设置“目的地=D:\Autobackup\”
设置“ip3=192.168.170”
Rem取消定义以fo开头的任何现有变量[
对于/F“Delims=”('Set fo[2^>Nul')中的%%A,请执行设置“%%A=”
Rem定义文件夹八位字节变量对
设置“fo[0]=R1.239”
设置“fo[1]=R2.240”
设置“fo[2]=R3.241”
设置“fo[3]=R4.242”
Rem请确保当前未映射%map%
净使用%map%/删除2>Nul
Rem循环遍历每个伪数组项
对于/F“Tokens=1*Delims==”%%A In('Set fo[')Do(
Rem映射共享
Net使用%map%\\%ip3%%%~xB\D/用户:User1密码
Rem执行所需的操作
XCopy“%source%”%destination%%%nB\“/Y
Rem删除映射的共享
净使用%map%/删除
)
你的意思是这样的吗
@Echo关闭
SetLocal EnableDelayedExpansion
Rem定义您的IP列表
设置“obj[0]=192.168.170.239”
设置“obj[1]=192.168.170.240”
设置“obj[2]=192.168.170.241”
设置“obj[3]=192.168.170.242”
Rem定义文件夹列表
设置“fol[0]=R1”
设置“fol[1]=R2”
设置“fol[2]=R3”
设置“fol[3]=R4”
Rem定义地图、来源和目的地
设置“map=T:”
设置“源=%map%\Autobackup”
设置“目的地=D:\Autobackup\”
Rem请确保当前未映射%map%
净使用%map%/删除2>Nul
Rem循环通过每个伪数组项0-3
对于(0,1,3)Do中的/L%%A(
Rem映射共享
Net使用%map%\\!obj[%%A]!\D/用户:用户1密码
Rem执行所需的操作
XCopy“%source%”%destination%%!fol[%A]!\”/Y
Rem删除映射的共享
净使用%map%/删除
)
有关其用法信息,请参见For/?
,特别请参阅For/L
部分
您也可以使用与原始结构相同的For/F
结构,但在设置变量时将IP地址的最后八位字节与文件夹名称链接:
@Echo关闭
Rem定义变量单
设置“map=T:”
设置“源=%map%\Autobackup”
设置“目的地=D:\Autobackup\”
设置“ip3=192.168.170”
Rem取消定义以fo开头的任何现有变量[
对于/F“Delims=”('Set fo[2^>Nul')中的%%A,请执行设置“%%A=”
Rem定义文件夹八位字节变量对
设置“fo[0]=R1.239”
设置“fo[1]=R2.240”
设置“fo[2]=R3.241”
设置“fo[3]=R4.242”
Rem请确保当前未映射%map%
净使用%map%/删除2>Nul
Rem循环遍历每个伪数组项
对于/F“Tokens=1*Delims==”%%A In('Set fo[')Do(
Rem映射共享
Net使用%map%\\%ip3%%%~xB\D/用户:User1密码
Rem执行所需的操作
XCopy“%source%”%destination%%%nB\“/Y
Rem删除映射的共享
净使用%map%/删除
)
根据您的评论,每个IP都链接到每个文件夹,因此您不应该单独定义这两个数组,而是从一开始就明确这一关系:
@echo off
setlocal EnableDelayedExpansion
rem Define the list of IP=FOLDER pairs and use it to define *two* arrays
set "n=0"
for %%a in ("192.168.170.239=R1"
"192.168.170.240=R2"
"192.168.170.241=R3"
"192.168.170.242=R4") do (
for /F "tokens=1,2 delims==" %%x in (%%a) do (
set /A n+=1
set "obj[!n!]=%%x"
set "fol[!n!]=%%y"
)
)
rem Define your Map, Source and Destination
set "map=T:"
set "source=%map%\Autobackup"
set "destination=D:\Autobackup\"
rem Make sure that %map% is not currently mapped
net use %map% /Delete 2>Nul
rem Loop through array elements from 1 to n
for /L %%i in (1,1,%n%) do (
rem Show the loop value
echo Processing %%i- Map ip !obj[%%i]! to folder !fol[%%i]!
rem Map the share
net use %map% \\!obj[%%i]!\D /User:User1 Password
rem Perform the required operation
xcopy "%source%" "%destination%!fol[%%i]!\" /Y
rem Delete the mapped share
net use %map% /Delete
)
通过这种方式,创建更多的IP:文件夹对更容易编写,而且您不必对它们进行计数…根据您的注释,每个IP都链接到每个文件夹,因此您不应该单独定义这两个数组,而是从一开始就明确这一关系:
@echo off
setlocal EnableDelayedExpansion
rem Define the list of IP=FOLDER pairs and use it to define *two* arrays
set "n=0"
for %%a in ("192.168.170.239=R1"
"192.168.170.240=R2"
"192.168.170.241=R3"
"192.168.170.242=R4") do (
for /F "tokens=1,2 delims==" %%x in (%%a) do (
set /A n+=1
set "obj[!n!]=%%x"
set "fol[!n!]=%%y"
)
)
rem Define your Map, Source and Destination
set "map=T:"
set "source=%map%\Autobackup"
set "destination=D:\Autobackup\"
rem Make sure that %map% is not currently mapped
net use %map% /Delete 2>Nul
rem Loop through array elements from 1 to n
for /L %%i in (1,1,%n%) do (
rem Show the loop value
echo Processing %%i- Map ip !obj[%%i]! to folder !fol[%%i]!
rem Map the share
net use %map% \\!obj[%%i]!\D /User:User1 Password
rem Perform the required operation
xcopy "%source%" "%destination%!fol[%%i]!\" /Y
rem Delete the mapped share
net use %map% /Delete
)
通过这种方式,创建更多的IP:文件夹对更容易编写,而且您不必计算它们……您需要更好地解释您希望它做什么!您希望XCopy
过程为每个IP
复制4次,还是希望每个IP
以某种方式链接到这些的1
de>目的地
文件夹,%fol[i]%
,如果是,哪个?我需要的是不同的ip,我有不同的目标文件夹。在这种情况下,对于ip 192.168.170.239,目标文件夹是D:\Autobackup\R1\。对于ip 192.168.170.240,目标文件夹是D:\Autobackup\R2\等等…在每个循环结束时,只有一个echo 1完成..2 finished等等…你需要做得更好解释您希望它做什么!您希望XCopy
进程为每个IP
复制4次,还是希望每个IP
以某种方式链接到那些目的地的1