3

以下のバッチファイルは、再帰の深さを示すためのインデント、フォルダ名の前の「/」、特定のファイルの前の「*」の追加、「アーカイブ」という名前のフォルダのスキップなど、いくつかの簡単なフォーマットを追加しながら、ファイルとフォルダを再帰的にエコーします。ファイルとフォルダがアルファベット順ではなくランダムにソートされることを除けば、うまく機能します。ファイルとフォルダの両方をアルファベット順に並べ替えるために、これをどのように変更できますか?

@echo off
setlocal disableDelayedExpansion
pushd %1
set "tab=   "
set "indent="
call :run
exit /b

:run

REM echo the root folder name
for %%F in (.) do echo %%~fF
echo ------------------------------------------------------------------

set "folderBullet=\"
set "fileBullet=*"

:listFolder
setlocal

REM echo the files in the folder
for %%F in (*.txt *.pdf *.doc* *.xls*) do echo %indent%%fileBullet% %%F  -  %%~tF

REM loop through the folders
for /d %%F in (*) do (

  REM skip "Archive" folder
  if /i not "%%F"=="Archive" (

  REM if in "Issued" folder change the file bullet
  if /i "%%F"=="Issued" set "fileBullet= "

  echo %indent%%folderBullet% %%F
  pushd "%%F"
  set "indent=%indent%%tab%"
  call :listFolder

  REM if leaving "Issued folder change fileBullet
  if /i "%%F"=="Issued" set "fileBullet=*"

  popd
))
exit /b
4

2 に答える 2

5

変更はほとんど必要ありません。ソートされたDIRコマンドを実行してFORループをFOR/Fに変換します。この/A-Dオプションはファイルのみを/ADリストし、ディレクトリのみをリストします。

このバージョンでは、ファイルを名前で並べ替えます

@echo off
setlocal disableDelayedExpansion
pushd %1
set "tab=   "
set "indent="
call :run
exit /b

:run

REM echo the root folder name
for %%F in (.) do echo %%~fF
echo ------------------------------------------------------------------

set "folderBullet=\"
set "fileBullet=*"

:listFolder
setlocal

REM echo the files in the folder
for /f "eol=: delims=" %%F in (
  'dir /b /a-d /one *.txt *.pdf *.doc* *.xls* 2^>nul'
) do echo %indent%%fileBullet% %%F  -  %%~tF

REM loop through the folders
for /f "eol=: delims=" %%F in ('dir /b /ad /one 2^>nul') do (

  REM skip "Archive" folder
  if /i not "%%F"=="Archive" (

  REM if in "Issued" folder change the file bullet
  if /i "%%F"=="Issued" set "fileBullet= "

  echo %indent%%folderBullet% %%F
  pushd "%%F"
  set "indent=%indent%%tab%"
  call :listFolder

  REM if leaving "Issued folder change fileBullet
  if /i "%%F"=="Issued" set "fileBullet=*"

  popd
))
exit /b

最初に拡張子で並べ替え、次に名前で並べ替えるには、単にに変更/ONE/OENます。

于 2013-02-20T19:26:11.850 に答える
3

for /dからループを変更してみてください

for /d %%F in (*) do

for /f "delims=" %%F in ('dir /b /o:n *.') do

それが違いを生むかどうかを確認してください。実際には、名前による順序付けがのデフォルトの動作でdirあるため、おそらく

for /f "delims=" %%F in ('dir /b *.') do

一部のディレクトリ名にドットが含まれている場合は、少し変更する必要があります。

for /f "delims=" %%F in ('dir /b') do (
    rem Is this a directory?
    if exist "%%F\" (
        rem do your worst....
    )
)
于 2013-02-20T19:09:54.693 に答える