【问题标题】:two for loops in batch to take data from two different text files两个 for 循环批量从两个不同的文本文件中获取数据
【发布时间】:2012-11-19 13:20:11
【问题描述】:

我正在尝试创建一个小脚本,该脚本将从文本文件 (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 的所有子文件夹。

【问题讨论】:

  • 数据是什么格式,即users.txt和id.txt的结构如何?
  • 您好 Jeroenh,感谢您的快速回复! users.txt 中的每一行 = 用户,ID.txt 也是如此,每个 ID 由一个简单的“Enter”分隔
  • 那么如何将用户与其 ID 关联起来?
  • 它们以相同的顺序排序,ID.txt 中的第一个 ID 用于 Users.txt 中的第一个用户,依此类推.. 假设我有 10 行用户和10行ID,ID.txt中的第5个ID属于Users.txt文件中的第5个用户。

标签: for-loop batch-file


【解决方案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!"
  )
)

【讨论】:

    【解决方案2】:

    根据您的 cmets,您可以保留各种计数器,并在嵌套循环中根据该计数器查找正确的 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。

    【讨论】:

      【解决方案3】:

      一种非常丑陋的方式;读取用户名,然后从 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
       )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 2021-11-04
        • 1970-01-01
        • 2020-05-30
        相关资源
        最近更新 更多