2011-12-05 33 views
55

Windowsバッチファイルについて:特定のディレクトリおよびそのサブディレクトリ内のすべてのファイル(または特定の種類のすべて)をリストする方法はありますか?現在の(または検索)ディレクトリのリスト?私は彼らの完全なパスを持つ、現在のディレクトリとサブディレクトリ内のすべてのTXTファイルをしたい場合はバッチファイル:ディレクトリ内のすべてのファイルを相対パスで一覧表示する

例えば、私は

for /r . %%g in (*.txt) do echo %%g >> C:\temp\test.txt 

または

dir *.txt /b /s >> C:\temp\test.txt 

を行うことができますし、私は

のようなものを取得します
C:\test\Doc1.txt 
C:\test\subdir\Doc2.txt 
C:\test\subdir\Doc3.txt 

私が行う場合

for /r . %%g in (*.txt) do echo %%~nxg >> C:\temp\test.txt 

私は

Doc1.txt 
Doc2.txt 
Doc3.txt 

のようなものは、しかし、私が本当にしたいことはあり得るでしょう。

Doc1.txt 
subdir\Doc2.txt 
subdir\Doc3.txt 

ことは可能ですか?

私の投稿があまりにも混乱している場合:基本的には、Windowsの場合は「List files recursively in Linux CLI with path relative to the current directory」が必要です。

答えて

22

あなたは、単にこの答えは等号(=)を含むルートのパスで正しく動作しません、現在のディレクトリの文字長を取得し、あなたの絶対リストから

setlocal EnableDelayedExpansion 
for /L %%n in (1 1 500) do if "!__cd__:~%%n,1!" neq "" set /a "len=%%n+1" 
setlocal DisableDelayedExpansion 
for /r . %%g in (*.log) do (
    set "absPath=%%g" 
    setlocal EnableDelayedExpansion 
    set "relPath=!absPath:~%len%!" 
    echo(!relPath! 
    endlocal 
) 
+0

'設定 "ABSPATH = %% G"' 'パスが含まれている場合は!'失敗します。遅延拡張トグルで修正できます。 – dbenham

+3

'!'の問題を修正しました。私は怠け者でした。誰にも起こらないと思っていました。 – jeb

9

それらを削除することもできます。 (おかげでそれを指摘して@dbenham。)


EDITED:!を含むパスで問題を修正し、再び@dbenhamによって発見(!ありがとう)。

あるいはサブストリングの長さを算出し、抽出には、異なるアプローチを使用できます。

  • ストアルートパスと、

  • ファイルパスからルートパスをクリアします。ここで

は(私のために働いていた)私の試みです:

@ECHO OFF 
SETLOCAL DisableDelayedExpansion 
SET "r=%__CD__%" 
FOR /R . %%F IN (*) DO (
    SET "p=%%F" 
    SETLOCAL EnableDelayedExpansion 
    ECHO(!p:%r%=! 
    ENDLOCAL 
) 

r変数は、現在のディレクトリが割り当てられています。 現在のディレクトリがディスクドライブのルートディレクトリでない限り、それは\で終わることはなく、文字を追加することで修正されます。(これ以上のケースはありません。スクリプトでは変数が読み取られるため、値は常に\で終わります(感謝@jeb!)、CDの代わりに)

ループでは、現在のファイルパスを変数に格納します。変数を出力し、途中でルートパスを取り除きます。もちろん

+0

ルートパスに '='が含まれていれば、これはうまくいきません。 – dbenham

+0

私は軽く心配して '' '' ''が名前で許可されていないと仮定しました。あなたのメモをありがとう、私は私の答えにそれを追加しています。 –

+0

4行目は 'IF NOT"%r:〜-1% "==" \ "SET" r =%r%\ "' – dbenham

4

、あなたはあなたがすべてのネストされたサブディレクトリに何をすべきかを正確に制御することができますバッチで再帰アルゴリズム書き込むこと:ディレクトリツリーを反復処理する方法

@echo off 
set mypath= 
call :treeProcess 
goto :eof 

:treeProcess 
setlocal 
for %%f in (*.txt) do echo %mypath%%%f 
for /D %%d in (*) do (
    set mypath=%mypath%%%d\ 
    cd %%d 
    call :treeProcess 
    cd .. 
) 
endlocal 
exit /b 
+0

チャームのように動作します! 私はこのアプローチが好きです:-) –

+0

最初のルックでも遅れている拡張トリックよりも心配しているようです – grenix

30

最も簡単な(最速ではなく)を相対ファイルパスを一覧表示するには、FORFILESを使用します。

:引用符と主要 .\を削除する

for /f %%A in ('forfiles /s /m *.txt /c "cmd /c echo @relpath"') do echo %%~A 


forfiles /s /m *.txt /c "cmd /c echo @relpath" 

相対パスは、引用符を削除する

".\Doc1.txt" 
".\subdir\Doc2.txt" 
".\subdir\Doc3.txt" 


と同様主要.\で引用されます

setlocal disableDelayedExpansion 
for /f "delims=" %%A in ('forfiles /s /m *.txt /c "cmd /c echo @relpath"') do (
    set "file=%%~A" 
    setlocal enableDelayedExpansion 
    echo !file:~2! 
    endlocal 
) 

または遅延拡張を使用せずに

for /f "tokens=1* delims=\" %%A in (
    'forfiles /s /m *.txt /c "cmd /c echo @relpath"' 
) do for %%F in (^"%%B) do echo %%~F 
+0

あなたのソリューションは私がcmdに値を出力するときに動作しますが、「@ relpath >> cache.appcache」親ディレクトリ内のファイルのみが一覧表示されます。あなたはそれを引き起こす可能性があることを知っていますか? – rory

+0

@rory - 手がかりではありません。/ Sオプションの使用を忘れていないことが確かな場合は、新しい質問にふさわしいと思われます。 – dbenham

+0

は間違いなく、cmdのウィンドウにはサブディレクトリを出力しますが、txtファイルは出力しません。私は新しい質問を投稿しますので、助けてくれてありがとう – rory

2
@echo on>out.txt 
@echo off 
setlocal enabledelayedexpansion 
set "parentfolder=%CD%" 
for /r . %%g in (*.*) do (
    set "var=%%g" 
    set var=!var:%parentfolder%=! 
    echo !var! >> out.txt 
) 
関連する問題