LoginSignup
1
5

More than 3 years have passed since last update.

ファイルサーバのファイルを一覧化するバッチ

Last updated at Posted at 2019-05-12

概要

あの情報が載っているファイルが何処かにあるはずだと思った時、
エクスプローラで検索窓にキーワードを入れてみたものの、長時間待った挙げ句に何も見つからなかった
なんて事があるかと思います。

本バッチファイルは、指定したディレクトリ配下のファイルを一覧化します。

これにより、サクラエディタ等のGrep機能でファイルを検索する事が出来ます。
ファイルサーバを逐一読みに行かなくて済むため、頻繁にファイルを探す用事がある人はかなり楽になると思います。

※「Grep」とは複数のファイルからキーワードに該当する部分を一括で抽出してくれるプログラムの事です。
正規表現を活用してGrepすると幸せになれます。サクラエディタを使用したGrepの仕方については、別記事で書きます。

PowerShell版を作成しました。
バッチファイルではサポートされなかったUNCパス (Universal Naming Convention Path) も扱えるため、ネットワークドライブの割り当てを行わずとも一覧化が可能になります。
また、バッチファイル版では一覧化されたファイルが "FileAttr", "FilePath" の2種類に分かれましたが、PowerShell版では1ファイルにファイルのフルパス・更新日時・ファイルサイズ・ファイル属性が含まれます。

環境

Windows 10, Windows 7

使用方法

  • 一覧化対象のディレクトリパスを記述したリストファイル(CSVファイル)を、"ListFile.bat" ファイルにDrag&Dropします。
  • ファイルへのドロップが難しい場合は、そのまま起動するとファイルパスの入力を求められるため、リストファイルをプロンプト画面にD&Dして [Enter]キーを押下します。

  • コマンドプロンプトの仕様上、ネットワークパス (\server\path) をカレントディレクトリに指定できないため、ドライブ文字に割り当てておく必要があります。

  • CSVファイルの例を同梱しましたので、参考にしてください。

    • 1カラム目に "attr" を記述すると更新日時及びサイズも出力され、"path" を記述するとファイルのフルパスが出力されます。終止符 '.' を含めると直下のみ、即ちサブディレクトリより下を含めずに出力します。何も記述しないとエラーになります。
    • 1カラム目にcmdを記述すると、2カラム目に記述したコマンドを実行します。 但し、3カラム目に記述したものと同じ名前のファイルが存在する場合は実行を回避します。複数のリストを並列で実行したい場合に互いのロックファイルを指定すると効果的です。
    • 1カラム目に "#" を含めると、その行の処理をスキップします。
  • 本バッチ実行後にロックファイルとして "(CSVファイル名)+.lock" が生成されます。これを削除すると、リスト内の次の行へ処理が移らずに、頭から再度処理が始まります。
    次以降の処理を変更したいけれど今の処理を中止したくない場合に便利です。

  • 同梱のバッチファイル "GetSubDir.bat" は、
    起動してディレクトリのパスをペーストすると、ディレクトリ直下のフォルダ名を "GetSubDir.txt" へ出力します。
    リスト作成に役立ちます。

  • 本バッチは、処理が成功したかを確認できるよう、下記の通りのログファイルを生成します。不要であれば削除しても差し支えありません。

    • リストファイル(CSVファイル)を1行処理する度に、ログファイル"ListFile.log" に処理結果及びパラメータが出力されます。
    • DIRコマンド自身がエラーを出力した場合、DIRコマンドを実行したディレクトリ及びエラー内容がログファイル "<リストファイル名>-err.log" に出力されます。

ソースファイル

「マジック生成」するには、本ページ全体を選択してコピー後にB642FHT.batを起動して下さい。
その後、生成したZIPファイルを解凍して任意の場所へ配置して下さい。

興味ある方は、以下のコードをご覧ください。

コード

バッチファイル版

ListFile.bat
@ECHO OFF
COLOR 0A

REM ############ ListFileS.bat #############
REM # Listing files                        #
REM #       in the specified directory     #
REM #                         core process #
REM #                                      #
REM #   1st release: 2019-05-12            #
REM #   Last update: 2019-07-13            #
REM #   Author: Y. Kosaka                  #
REM #   See the web for more information   #
REM #   https://qiita.com/x-ia             #
REM ########################################

SET nameDrvSearch=%2
SET drvSearch=%3
SET dirSearch=%4
SET drvSave=%5
SET dirSave=%6
SET optionList=%1
SET nameList=%7

SET nameDrvSearch=%nameDrvSearch:"=%
SET optionList=%optionList:"=%

SET nameFile=%~n0
SET nameAttr=FileAttr
SET namePath=FilePath

SET drvSearch="%drvSearch:~1,1%:"
SET drvSave="%drvSave:~1,1%:"
IF %dirSearch:~1,1%. NEQ \. SET dirSearch="\%dirSearch:"=%"
IF %dirSave:~1,1%. NEQ \. SET dirSave="\%dirSave:"=%"

SET namePathSearch="%nameDrvSearch:"=%\%dirSearch:"=%\"
SET namePathSearch=%namePathSearch:\\\=\%
SET namePathSearch=%namePathSearch:\\=\%
SET namePathSearch="%namePathSearch:"=%\"
SET dateNow=%date:~0,4%%date:~5,2%%date:~8,2%
SET timeNow=%time:~0,2%%time:~3,2%
SET timeNow=%timeNow: =0%
SET nameFileLog=err
SET extFileSave=.txt
SET extFileLog=.log

SET flagList=0
ECHO "%optionList%" | FIND /I "." >NUL
IF NOT ERRORLEVEL 1 (
  SET /A flagList=flagList+1  
  SET namePathSearch=%namePathSearch:\\=\%
) ELSE (
  SET namePathSearch=%namePathSearch:\\=%
  REM SET namePathSearch=%namePathSearch:~0,-2%"
)
SET namePathSearch=%namePathSearch:\=.%

ECHO "%optionList%" | FIND /I "p" >NUL
IF NOT ERRORLEVEL 1 SET /A flagList=flagList+2

SET pathSearch="%drvSearch:"=%%dirSearch:"=%\"
SET pathSave="%drvSave:"=%%dirSave:"=%\"
SET pathSearch=%pathSearch:\\=\%
SET pathSave=%pathSave:\\=\%
SET pathSaveFileAttr="%pathSave:"=%%nameAttr%-%namePathSearch:"=%_%dateNow%-%timeNow%%extFileSave%"
SET pathSaveFilePath="%pathSave:"=%%namePath%-%namePathSearch:"=%_%dateNow%-%timeNow%%extFileSave%"
REM SET fullNameFileLog="%nameFile%-%namePathSearch:"=%_%nameFileLog%%extFileLog%"
SET pathFileLog="%nameList:"=%-%nameFileLog%%extFileLog%"

ECHO %date% %time%  %pathSearch%>>%pathFileLog%

IF %flagList% EQU 2 (
  DIR /S /A /B %pathSearch% 1>> %pathSaveFilePath% 2>> %pathFileLog%
) ELSE IF %flagList% EQU 3 (
  DIR /A /B %pathSearch% 1>> %pathSaveFilePath% 2>> %pathFileLog%
) ELSE IF %flagList% EQU 0 (
  DIR /S /A-L /T:W /4 %pathSearch% 1>> %pathSaveFileAttr% 2>> %pathFileLog%
) ELSE IF %flagList% EQU 1 (
  DIR /A-L /T:W /4 %pathSearch% 1>> %pathSaveFileAttr% 2>> %pathFileLog%
)
EXIT /B
ListFile.bat
@ECHO OFF
COLOR 0B
SETLOCAL ENABLEDELAYEDEXPANSION

ECHO ############# ListFile.bat #############
ECHO # Listing files                        #
ECHO #       in the specified directory     #
ECHO #                      iteration batch #
ECHO #                                      #
ECHO #   1st release: 2019-05-12            #
ECHO #   Last update: 2019-07-13            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=%~n0
SET fList="%1"
SET extLog=.log
SET extLock=.lock

:inFile
IF %fList% EQU "" (
  ECHO Current directory = %~dp0
  ECHO.
  ECHO Option,SearchDrvName/Cmd,SearchDrv/LockFile,SearchPath,SaveDrive,SavePath,Option
  ECHO Enter the file includes parameters for listing up files like above.
  SET /P fList=filepath= 
) ELSE (
  ECHO Input file:
  ECHO %fList%
)

ECHO "%fList%" | FIND /I "\" >NUL
IF ERRORLEVEL 1 SET fList=%~dp0%fList%
SET fList="%fList:"=%"

COPY /Y %fList% "%fList:"=%%extLock%">NUL

:count
SET nLine=0
FOR /F "usebackq skip=1 tokens=1-2 delims=," %%a IN ("%fList:"=%%extLock%") DO (
  SET /A nLine+=1
)
SET nLineMax=%nLine%
SET nLine=0
SET nLineSucc=0

:iterate
FOR /F "usebackq skip=1 tokens=1-6 delims=," %%a IN ("%fList:"=%%extLock%") DO (
  SET /A nLine+=1
  TITLE %tScr% !nLineSucc!/!nLine!/%nLineMax%

  SET flag=.
  ECHO "%%a" | FIND /I "c" >NUL
  IF NOT ERRORLEVEL 1 SET flag=c
  ECHO "%%a" | FIND /I "#" >NUL
  IF NOT ERRORLEVEL 1 SET flag=#

  IF !flag! EQU # (
    ECHO !date! !time!  Skipped %%a %%b %%c %%d %%e %%f
    ECHO !date! !time!  %tScr%  Skipped %%a %%b %%c %%d %%e %%f>>%~dpn0%extLog%
  ) ELSE IF !flag! EQU c (
    IF EXIST %%c (
        ECHO !date! !time!  Skipped executing %%a
        ECHO due to a lock file %%c
        ECHO !date! !time!  %tScr%  Skipped %%a %%b %%c>>%~dpn0%extLog%
    ) ELSE (
      ECHO !date! !time!    Execute %%a %%b
      ECHO !date! !time!    %tScr%  Execute %%a %%b>>%~dpn0%extLog%
      %%b
      SET return=!ERRORLEVEL!
      IF !return! EQU 0 (
        SET return=Done
        SET /A nLineSucc+=1
      ) ELSE (
        SET return=Error !return!
      )
      ECHO !date! !time!    %tScr%  !return!    %%a %%b>>%~dpn0%extLog%
    )
  ) ELSE (
    ECHO !date! !time!  Start   %%a %%b %%c %%d %%e %%f
    ECHO !date! !time!  %tScr%  Start   %%a %%b %%c %%d %%e %%f>>%~dpn0%extLog%
    CALL %~dp0%tScr%S.bat "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" %fList%
    SET return=!ERRORLEVEL!
    IF !return! EQU 0 (
      SET return=Finish
      SET /A nLineSucc+=1
    ) ELSE (
      SET return=Error !return!
    )
    ECHO !date! !time!  !return!    %%a %%b %%c %%d %%e %%f
    ECHO !date! !time!  %tScr%  !return!    %%a %%b %%c %%d %%e %%f>>%~dpn0%extLog%
  )
  IF NOT EXIST "%fList:"=%%extLock%" (
    ECHO Batch list has reset.
    GOTO infile
  )
  ECHO.
)

TITLE %tScr% !nLineSucc!/!nLine!/%nLineMax%
DEL "%fList:"=%%extLock%"
TIMEOUT /T -1
ENDLOCAL
EXIT /B
GetSubDir.bat
@ECHO OFF
COLOR 0A
SETLOCAL ENABLEDELAYEDEXPANSION

ECHO ############ GetSubDir.bat #############
ECHO # Getting subfolders                   #
ECHO #                                      #
ECHO #   Last update: 2019-05-18            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=%~n0
SET fScr=%~dpn0
SET extOut=.txt
TITLE %tScr%

:loop
CALL :pInput %1
IF %pInput% EQU "" GOTO eof
IF NOT EXIST %pInput% (
  ECHO Specified directory not exists.
  GOTO loop
)

CALL :getsub
SET /A cnt=cnt+1
TITLE %tScr% %cnt%paths 

SHIFT
ECHO.
GOTO loop

:eof
ECHO Terminated. 
PAUSE
ENDLOCAL
EXIT /B


:pInput
ECHO.
IF %1. NEQ . (
  SET pInput="%1"
  ECHO !pInput!
) ELSE (
  SET pInput=
  ECHO Enter the directory to get subfolders.
  ECHO (To exit, hit the Enter key w/o any characters^)
  SET /P pInput=directory path= 
)
IF !pInput!. EQU . SET pInput=""
SET pInput="!pInput:"=!"
ECHO !pInput!
EXIT /B


:getsub
ECHO %date% %time%  %tScr%  %pInput%>>"%fScr:"=%%extOut%"
DIR /B /AD %pInput%>>"%fScr:"=%%extOut%"
ECHO.>>"%fScr:"=%%extOut%"
DIR /AD %pInput%
EXIT /B

PowerShellスクリプト版

LsFile.ps1
$Host.UI.RawUI.ForeGroundColor = "Green"

"############## LsFile.ps1 ##############"
"# Listing files                        #"
"#       in the specified directory     #"
"#                        by PowerShell #"
"#                                      #"
"#   1st release: 2019-07-30            #"
"#   Last update: 2019-08-05            #"
"#   Author: Y. Kosaka                  #"
"#   See the web for more information   #"
"#   https://qiita.com/x-ia             #"
"########################################"

$nameFileScript = (Get-ChildItem $MyInvocation.MyCommand.Path).BaseName
$dirPathScript = Split-Path $MyInvocation.MyCommand.Path -Parent
$extOut = ".txt"
$nameOut = "FList-"
$nameErr = "LsErr"
$extLog = ".log"
$extLock = ".lock"
$Host.UI.RawUI.WindowTitle = $nameFileScript
$pathFileList = $Args[0]
$pathFileLog = $dirPathScript + "\" + $nameFileScript + $extLog
$iArg = 0
$numIn = 0
$numOut = 0
$timePause = 1500

if (-Not (Test-Path $pathFileList)) {
  Write-Host "`r`nOption,SearchDrvName/Cmd,SearchDrv/LockFile,SearchPath,SaveDrive,SavePath,Option"
  Write-Host "Enter the path of a CSV file containing parameters for listing up files like above."
  $pathFileList = Read-Host
  if ($pathFileList -eq $null) {
    $pathFileList = "nul"
  }
  if (-Not (Test-Path $pathFileList)) {
    Write-Host "`r`nFile not found.`r`nTerminated."
    Start-Sleep -milliseconds $timePause
    Exit
  }
} else {
  Write-Host "`r`nCSV file containing parameters for listing up files`r`n$pathFileList`r`n"
}

$arrList = Get-Content $pathFileList | `
ConvertFrom-CSV -header keyOpt,keyLabelSearch,keyDrvSearch,keyPathSearch,keyDrvOut,keyPathOut -Delimiter ","
$pathFileLock = $pathFileList + $extLock
Copy-Item $pathFileList $pathFileLock

$pathFileLog = $dirPathScript + "\" + $nameFileScript + "-" + $(Get-ChildItem $pathFileList).BaseName + $extLog
$pathFileErr = $dirPathScript + "\" + $nameErr + "-" + $(Get-ChildItem $pathFileList).BaseName + $extLog

for ($i=0; $i -lt $arrList.Length; $i++){
  $dateNow = (Get-Date).ToString("yyyyMMdd")
  $timeNow = (Get-Date).ToString("HHmmss")
  $timeStamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

  $strParams = "$arrList[$i].keyOpt`t$arrList[$i].keyLabelSearch`t$arrList[$i].keyDrvSearch`t$arrList[$i].keyPathSearch`t$arrList[$i].keyDrvOut`t$arrList[$i].keyPathOut"

  if ($arrList[$i].keyOpt -like "*#*") {
    $strResult = "Skipped"
  } elseif (($arrList[$i].keyOpt -like "*cmd*") -Or ($arrList[$i].keyOpt -like "*cmd*")) {
    if (Test-Path keyDrvSearch) {
      Write-Host "$timeStamp`tSkipped executing`t$arrList[$i].keyLabelSearch"
      Write-Host "`tdue to a lock file`t$arrList[$i].keyDrvSearch"
      $strResult = "Skipped"
    } else {
      try {
        Write-Host "$timeStamp`tExecuting`t$arrList[$i].keyLabelSearch"
        "$timeStamp`t$nameFileScript`tExecuting`t$strParams" | `
          Out-File $pathFileLog -Encoding Default -Append
        $strResult = "Executed"
        if (($arrList[$i].keyOpt -like "*cmdlet*") -Or ($arrList[$i].keyOpt -like "*commandlet*")) {
          Write-Host "$timeStamp`tCommandlet`t$arrList[$i].keyLabelSearch"
          Invoke-Expression $arrList[$i].keyLabelSearch
        } else {
          Write-Host "$timeStamp`tExecuting`t$arrList[$i].keyLabelSearch"
          CMD /C $arrList[$i].keyLabelSearch
        }
      } catch {
        $error[0] | Out-String | Out-File "$pathFileErr" -Append
        $strResult = "Error"
      }
    }
  } else {
    if ($arrList[$i].keyOpt -like "*`.*") {
      $optSub = ""
    } else {
      $optSub = "-Recurse"
    }

    if ($arrList[$i].keyDrvSearch.SubString(0,1) -ne "\"){
      $arrList[$i].keyDrvSearch = $arrList[$i].keyDrvSearch.SubString(0,1) + ":"
    }
    $pathDir = $arrList[$i].keyDrvSearch + "\" + $arrList[$i].keyPathSearch
    $pathDir = $pathDir.Replace("\\", "\")
    if ($pathDir.SubString(0,1) -eq "\") {
      $pathDir = "\" + $pathDir
    }

    if ($arrList[$i].keyDrvOut.SubString(0,1) -ne "\"){
      $arrList[$i].keyDrvOut = $arrList[$i].keyDrvOut.SubString(0,1) + ":"
    }
    $pathFileOut = $nameOut + $arrList[$i].keyLabelSearch + "." + $arrList[$i].keyPathSearch.Replace("\", ".") + "\" 
    if ($arrList[$i].keyOpt -notlike "*`.*") {
      $pathFileOut = $pathFileOut.SubString(0, $pathFileOut.Length - 1)
    }
    $pathFileOut = $arrList[$i].keyDrvOut + "\" + $arrList[$i].keyPathOut + "\" + $pathFileOut + "_" + $dateNow + "-" + $timeNow + $extOut
    $pathFileOut = $pathFileOut.Replace("\\", "\").Replace("..", ".")
    if ($pathFileOut.SubString(0,1) -eq "\") {
      $pathFileOut = "\" + $pathFileOut
    }
    $cntErr = 0

    Write-Host "$timeStamp`tStarted`t$strParams"
    "$timeStamp`t$nameFileScript`tStarted`t$strParams" | `
      Out-File $pathFileLog -Encoding Default -Append
    try {
      $cmdLs = "Get-ChildItem `"$pathDir`" * $optSub -Force 2>> `"$pathFileErr`" `| `
        Select-Object Mode,Length,LastWriteTime,FullName `| `
        ConvertTo-CSV -Delimiter `"`t`" -NoType `| % { `$_ -Replace `'`"`', `"`" } `| `
        Out-File `"`$pathFileOut`" -Encoding Default"
      Invoke-Expression $cmdLs
    } catch {
      $error[0] | Out-String | Out-File "$pathFileErr" -Append
      ++$cntErr
    } finally {
      $strResult = "Finished($cntErr)"
    }
  }

  $timeStamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
  Write-Host "$timeStamp`t$strResult`t$strParams"
  "$timeStamp`t$nameFileScript`t$strResult`t$strParams" | `
    Out-File $pathFileLog -Encoding Default -Append
  if (-Not (Test-Path $pathFileLock)) {
    $i = 0
    Write-Host "Batch list has reset."
  }
}

Remove-Item $pathFileLock
Start-Sleep -milliseconds $timePause

バイナリ (Base64 encoding)

ListFile.zip
---
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
---
GetSubDir.zip
---
UEsDBBQAAAAIAIOM7U6BuMAsRAIAAO4EAAANAAAAR2V0U3ViRGlyLmJhdI1T72vb
MBD9XIP/h4uDoGWLkwwGWyBlbqK0ZiZuaxfaLwPHURrRxvLsC02/9G/fSarzY926
CWws6d27d+/O3/joIoZ4MnGdURzF19ALXCfhaRSPggj4NDiL+JhHwR29by+DaRLG
U9dxHRPW3ltwLjBZz8ay8mcZHly1G7jGoCzuoV7PFupxLqoa3q4d/L/WPjzKaoR1
Oc9QDOBTr/+10/vc6X/5GzxY41JVA7jz4buqs4fsffZECMClgCcxg4WqYKUqAbKg
z1WGUhW/wZeIZT3odn9KiZmfq1V305GHKdp/MPK9pZ2n5gAmeTVkL0XPbhd2Oy+b
A7HBeI1DHzfoOmmYRhyYjmGaYPCoVEntDqIIBmVYlGsE1nedcALMbhnwqxvwPDiP
0xiEWpjLaZwCvw2TdAc7dh0AU0FSilwupJjDXFYiR1U9Q6GQlMgaa1/jDJnNfaJ1
WAH3AmkarOxuAHmBQ3o+9A91A6NDVma4rMGYcBFOUmsece8xU3lGrxGVimolCxqG
uU9Rl8FNwulmOjbDTV+3IeU800EUZmvacmo3+j5M+RX4tk6t0IKGHut729Jb9rBF
ZQGPEv4GvUXyAkVlRmhnEiogC/b+CH8LP06V9g8/wlKiCbMED+IZnroKsuIZ8mVW
ZTmd1j9OmrTdyybzLo22bgjGeaqskeybRvsHpXm2F832FTrwhi3v1dZdwYcONq00
IKZ/QuobypVgR7aLR83gnJ56TA8tsTJmh5UR+zi8JjYagzH8A2ma9B7LHsWezF9Q
SwECFAAUAAAACACDjO1OgbjALEQCAADuBAAADQAAAAAAAAABACAAAAAAAAAAR2V0
U3ViRGlyLmJhdFBLBQYAAAAAAQABADsAAABvAgAAAAA=
---
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5