2016年5月18日水曜日

_listEmptyDirectory.bat

@echo off
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
setlocal DISABLEDELAYEDEXPANSION

@rem 説明:
@rem 指定されたディレクトリ配下の空ディレクトリのパスの一覧を出力します。
@rem ディレクトリは複数を指定できます。
@rem ディレクトリが指定されない場合、このバッチファイルが置かれたディレクトリを対象とします。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。

@rem Usage:
@rem _listEmptyDirectory.bat [<dirpath> [...]]

call :L_main %*
exit /b !errorlevel!
goto :eof

:L_main
call :L_lsredirs %*
goto :eof

:L_lsredirs
if "%~1"=="" (
  call :L_lsredir1 "%~dp0"
) else (
  for %%v in (
    %*
  ) do (
    if not "%%~v"=="" (
      if exist "%%~v" (
        call :L_lsredir1 "%%~v"
      )
    )
    shift
  )
)
goto :eof

@rem http://fpcu.on.coocan.jp/dosvcmd/bbs/log/dir/4-1473.html
@rem 指定されたディレクトリ配下の空ディレクトリのパスの一覧を出力します。
@rem ディレクトリは1つ指定します。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。
:L_lsredir1
for /R "%~1" %%w in ( . ) do (
  if exist "%%~w" (
    call :L_lsedir1 "%%~w" 2> nul
  )
)
goto :eof

@rem 指定されたディレクトリが空ディレクトリの場合、そのディレクトリのパスを出力します。
@rem ディレクトリは1つ指定します。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。
:L_lsedir1
set "arg1=%~1"
for /f "usebackq tokens=1-3" %%x in (
  `dir "%~1" ^| find "個のファイル"`
) do (
  set "filenum=%%x"
  set "bytes=%%z"
)
set "bytes=%bytes:,=%"
for /f "usebackq tokens=1" %%z in (
  `dir "%~1" ^| find "個のディレクトリ"`
) do (
  set "dirnum=%%z"
)
if %filenum% equ 0 (
  if %bytes% equ 0 (
    if %dirnum% equ 2 (
      echo %arg1:~,-2%
    )
  )
)
goto :eof