2016-10-25 6 views
4

特定のポイント&からパスを解析して、それを使用してダイナミックアレイを生成します。バッチ:ダイナミックアレイからのファイルパスの解析

例:

Folder tree: 
C:\Main\folder1 
C:\Main\folder2\folder2-1 
C:\Main\folder3\folder3-1\folder3-2 

Desired result: 
Array[1]=folder1 
Array[2]=folder2 
Array[3]=folder2\folder2-1 
Array[4]=folder3 
Array[5]=folder3\folder3-1\ 
Array[6]=folder3\folder3-1\folder3-2 

これは細かいが、完全なパスに返す下に作業コードである:

@echo off 
setlocal EnableDelayedExpansion 
SET folders=C:\Main 

rem Populate the array with existent files in folder 
set i=0 
for /r "%folders%" /d %%a in (*) do (
    set /A i+=1 
    set list[!i!]=%%a 
) 
set foldnum=%i% 

rem Display array elements 
for /L %%i in (1,1,%foldnum%) do (SET array[%%i]=!list[%%i]!) 

for /F "tokens=2 delims==" %%f in ('set array[') do echo %%f 
+0

は、なぜあなたは[] 'への配列'リストをコピーします '配列[]'表示するための '/ 'L'のためのループで? – aschipfl

+0

これは私が見つけたコードのブロックでした。私はそれが非効率であることを見て編集されます。 – Sid

+3

数か月前にこの質問をしたようです。 http://stackoverflow.com/questions/38511607/batch-recursing-through-folders-populating-an-array – Squashman

答えて

2

あなたはFORループの絶対パスを渡します。しかし、相対パスでさえ、FORループはあまりにも多く、絶対パスに変換します。

ここでのトリックは、FORループの絶対パスを置き換えることです。

本当の変数その後

set AA=%%a 

リスト「配列」

set list[!i!]=!AA:%folders%\=! 

完全な固定コードで何によってプレフィックス+バックスラッシュを置き換えるにはループ変数のコピーを作成します。

@echo off 
setlocal EnableDelayedExpansion 
SET folders=C:\Main 

rem Populate the array with existent files in folder 
set i=0 
for /r "%folders%" /d %%a in (*) do (
    set /A i+=1 
    rem create a copy of the loop variable in a real variable 
    set AA=%%a 
    rem replace prefix+backslash by nothing in a the list "array" 
    set list[!i!]=!AA:%folders%\=! 
) 
set foldnum=%i% 

rem Display array elements 
for /L %%i in (1,1,%foldnum%) do (SET array[%%i]=!list[%%i]!) 

for /F "tokens=2 delims==" %%f in ('set array[') do echo %%f 

%folders%のすべてのディレクトリを取得します。

+0

ちょうどテスト&私はまだ完全なパスを受けています私はこの行が犯人かもしれないと思う**セットBB =! AA:%folders%\ =!**あなたはこれについて詳しく教えてください。 – Sid

+0

上記のコードが動作します。私はそれを簡略化するためにそれを編集しました(無用なBB変数を削除し、より多くの説明を追加しました) –

+0

それは構文の問題でした。 BBの主張のバックスラッシュを削除し、それは働いた。 FOLDERS変数にはすでにパスにバックスラッシュがあります。ありがとうございました – Sid

0

Tom Fooleryの少しです。

@echo off 
setlocal EnableDelayedExpansion 
SET folders=C:\Main 

subst B: %folders% 
B: 

set i=0 
for /r /d %%G in (*) do (
    set /A i+=1 
    FOR /F "tokens=* delims=\" %%H IN ("%%~pnG") do set "array[!i!]=%%~H" 
) 
C: 
subst B: /D 
set foldnum=%i% 

rem Display array elements 
for /F "tokens=2 delims==" %%f in ('set array[') do echo %%f 

pause 
関連する問題