Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为批处理文件中的两个不同数组创建两个for循环_Windows_Batch File_Cmd - Fatal编程技术网

Windows 为批处理文件中的两个不同数组创建两个for循环

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

我正在处理带有数组和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"
我为目标文件夹又创建了一个数组

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