2016-11-19 12 views
1

バッチファイルの出力は、フォルダとサブフォルダの短い名前のみをファイルに出力しようとしています。しかし、以下の例では、フルパスしか取得できません。Windowsバッチファイル - すべてのフォルダとサブフォルダの相対パスを表示

DIR /S /B /O:N /A:D > FolderList.txt 

どちらの出力は以下となります。

X:\Example\Folder 1 
X:\Example\Folder 2 
X:\Example\Folder 3 
X:\Example\Folder 1\Sub-Folder 1 
X:\Example\Folder 1\Sub-Folder 2 
X:\Example\Folder 2\Sub-Folder 1 

所望の出力は次のようになります。

Folder 1 
Folder 2 
Folder 3 
Folder 1\Sub-Folder 1 
Folder 1\Sub-Folder 2 
Folder 2\Sub-Folder 1 

問題は、サブフォルダに再帰するDIRコマンドを許可/Sスイッチが付属しています。

Windowsバッチファイルのみを使用して、現在のディレクトリ内のフォルダとサブフォルダのリストをテキストファイルに出力する簡単な方法はありますか?

+0

@stackoverflow.com/questions/8385454/batch-files-list-all-files-in-a-directory-with-relative-pathsの複製 – Compo

+0

@Compoこれは重複していますか?あなたがリンクしている質問は**ファイル**を指していますが、私は**フォルダ**のリストが必要です。 – Deadmano

答えて

1

これは、古いSUBSTコマンドで少しトリックを使用して、ルートフォルダをドライブ文字にします。次に、FORコマンド修飾子を使用して、出力時の変数からドライブ文字をドロップできます。

@echo off 

SET "folders=X:\Example" 

subst B: "%folders%" 
B: 

(FOR /F "delims=" %%G in ('DIR /S /B /O:N /A:D') do echo %%~pnxG)>"%~dp0folderlist.txt 

subst B: /D 

明らかに、これはドライブ文字B:を使用する前に利用可能であることを確認していません。 SUBSTコマンドを実行する前に、使用していないドライブ文字を確認するためのコードを追加するだけの簡単さ。重複回答私のコメントを確認するために

+1

パスに '.'を' echo。%%〜pnxG'のように相対的に相対的に前に置く必要があります – aschipfl

0

:あなたは「短い名前」を尋ねるため

@Echo Off 
SetLocal EnableDelayedExpansion 
For /L %%A In (1 1 8192) Do If "!__CD__:~%%A,1!" NEq "" Set/A "Len=%%A+1" 
SetLocal DisableDelayedExpansion 
(For /D /R %%A In (*) Do (
    Set "AbsPath=%%A" 
    SetLocal EnableDelayedExpansion 
    Echo(!AbsPath:~%Len%! 
    EndLocal))>FolderList.txt 
0
@ECHO OFF 
FOR /f "delims=" %%a IN ('DIR /S /B /O:N /A:D') DO (
SET "name=%%a" 
SETLOCAL ENABLEDELAYEDEXPANSION 
ECHO(!name:%cd%\=! 
endlocal 
) 

GOTO :EOF 

は、「相対名」を記述もう少し混乱しました。

明らかに、単にechoという名前を画面に表示します。あなたはリダイレクトする方法を知っています。ただ、起動フォルダと呼ばれた場合、それはサブフォルダのリストを反復処理し、それぞれのためのサブルーチンを処理するために自分自身を呼び出します

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    call :getSubFolderList "%~1" 
    goto :eof 

:getSubFolderList folder [prefix] 
    for /d %%a in ("%~f1.\*") do for %%b in ("%~2%%~nxa") do (
     echo %%~b 
     call :getSubFolderList "%%~fa" "%%~b\" 
    ) 
    goto :eof 

再帰関数呼び出しのアプローチを用いて溶液を含むように

0

降順のフォルダ。

echoを使用してフォルダパスを出力するこの質問に対するその他の回答は、delayedexpansionを使用して、パーサーによる問題なく使用された変数の内容をエコーし​​ます。しかし、この回答のコードでは遅延拡張を使用していないため、echoコマンドではフォルダ名に&()という文字が問題になる可能性があります。

この問題を回避するには、echoの値を引用符で囲み、置換可能なパラメータforの中にラップします。これがコード内のfor %%bの理由です。

フォルダのリストを使用してファイルを生成するには、必要な唯一の変更は、最初のcallコマンドで、次のとおりです。

call :getSubFolderList "%~1" > fileList.txt 

注:答えのコードを処理するフォルダを受け取るために書かれていますバッチファイルの最初の引数として指定します。"%~1"を必要に応じて変更してください。

関連する問題