批处理中的两个for循环从两个不同的文本文件中获取数据

时间:2012-11-19 13:20:12

标签: for-loop batch-file

我正在尝试创建一个小脚本,它将为文本文件(Users.txt)中的每个用户名创建文件夹,并在该文件夹中创建另一个带有ID(ID.txt)的子文件夹

我创建了以下脚本:

@echo off


setlocal EnableDelayedExpansion
set Users=Users.txt
set ID=id.txt

for /f %%i IN (%Users%) DO ((
    set username=%%i
    )       
    for /f %%j IN (%ID%) DO (
    set ID=%%j
    mkdir c:\Test\!username!\!ID!       
)
)

但结果是,对于每个“用户”文件夹,我获得了所有ID的子文件夹。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

假设两个文件的行数相同:

@echo off
setlocal EnableDelayedExpansion
set "userFile=Users.txt"
set "idFile=id.txt"
<"%idFile%" (
  for "usebackq" /f %%i IN ("%userFile%") do (
    set /p "id="
    mkdir "c:\Test\%%i\!id!"
  )
)

答案 1 :(得分:0)

根据您的评论,您可以保留一个排序计数器,并在您的嵌套循环中根据该计数器查找正确的ID。我甚至不确定这是否可行。

这样的事可能(未经测试):

set COUNTER = 0
for /f %%i in (%users%) do (
    set /A COUNTER = %COUNTER%+1
    goto :callInnerLoop %%i %COUNTER%
)

goto :EOF
:callInnerLoop
SET LOCALCOUNTER=0
for /f %%i in (%id%) DO (
   set /A COUNT=%COUNT%+1
   if (!COUNT!=%2) (
      REM FOUND %ID%
      goto :EOF
   )   
)

这是非常混乱的代码,但批处理脚本似乎不适合这项工作。如果您可以合并文件(例如,每行上带有'USERNAME; ID'的CSV文件),这将变得更加容易。否则我建议切换到更强大的脚本语言,如powershell。

答案 2 :(得分:0)

一种非常丑陋的方式;读取用户名然后从id文件中获取相应的行

@echo off
setlocal disabledelayedexpansion
set Users=Users.txt
set ID=id.txt
set linenum=0

for /f %%i IN (%Users%) DO (
  call :getId %%linenum%% %%i
  set /a linenum=linenum+1  
)
goto :eof
:getId
if "%1"=="0" (set options=) else set options=skip=%1
for /f "%options%" %%j in (%id%) do (
    echo %2\%%j
    goto:eof
 )