4

テキストファイル()からユーザー名ごとにフォルダーを作成する小さなスクリプトを作成しようとして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!       
)
)

しかし、その結果、「user」フォルダーごとに、すべてのIDのサブフォルダーを取得しました。

4

3 に答える 3

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!"
  )
)
于 2012-11-19T13:56:23.330 に答える
0

かなり醜い方法の1つ。ユーザー名を読み取り、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
 )
于 2012-11-19T13:55:03.317 に答える
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 などのより強力なスクリプト言語に切り替えることをお勧めします。

于 2012-11-19T13:45:13.970 に答える