フォルダ内のファイルのリストが欲しい 2017/01/14

Pocket

Windows Serverのフォルダ内のファイルのリストが欲しい。

もちろん、サブフォルダの中も。

そして、フォルダのパスとファイルの更新日時、サイズの情報も。

Treeコマンドだと、ファイル名しか取得できなので、Dirコマンドで何とかしたいのだが・・・。

> tree /F c:\test

色々、試してみて下記のコマンドだと、一応欲しい情報がすべて取得できるのだが、結果の出力がいまいち。

> dir c:\test /b /a-d /s

仕方がないので最終的に下記のコマンドの実行結果をCSV形式のファイルに編集するスクリプトを作成しました。

> dir c:\test /a-d /s /oen

せっかくなので勉強がてらWindows PowerShellに挑戦しました。
できたのがこちら。


###############################################################################
# Dirコマンドの結果をCSVファイルへ出力する
# > dir [対象パス] /a-d /s /oen
#
# 実行コマンド
# > .\ConvDirListToCsv.ps1 [入力ファイルパス] [出力ファイルパス]
###############################################################################

# 引数の数を確認
if ($args.length -eq 0) {
    Write-Host "引数が指定されていない"
    exit 1
} elseIf ($args.length -gt 2) {
    Write-Host "引数が多すぎ"
    exit 1
}

# 入力ファイルの存在確認
if (!(Test-Path $args[0])) {
    Write-Host $args[0] "は存在しません"
    exit 1
}

# 出力先のファイルの存在確認
if (Test-Path $args[1]) {
    Write-Host $args[1] "は存在してます"
    exit 1
}

# 出力ファイルを生成
New-Item $args[1] -type file

# 定数の設定
set-variable -name DIR_STR -value "のディレクトリ" -option constant
set-variable -name TOTAL_STR -value "ファイルの総数:" -option constant
set-variable -name BYTE_STR -value "バイト" -option constant
set-variable -name NOTUSE_STR -value "バイトの空き領域" -option constant

# 変数の初期化
$getpath = ""
$putStr = ""

# 入力データを編集
foreach ($row in Get-Content $args[0]) {
    if ($row.EndsWith($DIR_STR)) {
        $getpath = ($row.Substring(0, $row.IndexOf($DIR_STR))).Trim()
    } elseIf (($row.EndsWith($TOTAL_STR)) -Or ($row.EndsWith($BYTE_STR)) -Or ($row.EndsWith($NOTUSE_STR))) {
        # 対象外の文字列なのでスルー
    } else {
        if (!($row -eq "") -And !($getpath -eq "") ) {
            $putstr = $getPath + "," + $row.Substring(36, $row.length - 36) + "," + $row.Substring(0, 10) + `
                      "," + $row.Substring(12, 5) + "," + (($row.Substring(18, 18).Trim()).Replace(",", ""))
            Add-Content $args[1] $putstr
        }
    }
}

 

取得した状態はこんな感じ。


c:\test のディレクトリ

2016/12/14 23:10 0 テストテスト.docx
2015/10/11 03:07 1,745 aaaa.log
2015/09/06 02:46 122 abcabc.txt
 3 個のファイル 1,867 バイト

c:\test\xyz のディレクトリ

2016/12/14 23:13 567 テストテストのショートカット.lnk
 1 個のファイル 567 バイト

c:\test\名前が日本語フォルダ のディレクトリ

2016/12/14 23:12 0 bitbit.bmp
2016/12/14 23:12 8,860 exexex.xlsx
 2 個のファイル 8,860 バイト

c:\test\名前が日本語フォルダ\三階層目のフォルダ のディレクトリ

2016/12/14 23:11 8,860 サンサン.xlsx
 1 個のファイル 8,860 バイト

ファイルの総数:
 7 個のファイル 20,154 バイト
 0 個のディレクトリ 107,506,352,128 バイトの空き領域

 

出力結果はこんな感じ。


c:\test,テストテスト.docx,2016/12/14,23:10,0
c:\test,aaaa.log,2015/10/11,03:07,1745
c:\test,abcabc.txt,2015/09/06,02:46,122
c:\test\xyz,テストテストのショートカット.lnk,2016/12/14,23:13,567
c:\test\名前が日本語フォルダ,bitbit.bmp,2016/12/14,23:12,0
c:\test\名前が日本語フォルダ,exexex.xlsx,2016/12/14,23:12,8860
c:\test\名前が日本語フォルダ\三階層目のフォルダ,サンサン.xlsx,2016/12/14,23:11,8860

 

一応、これでCSV形式になるのでOKかな。

 

 

Trackback URL

Leave a Reply