vbscriptが廃止になると聞いて…(略。powershell5で指定したフォルダの直下にあるファイルのファイル名と最終更新日を取得するものを作成した。powershellなので実行には癖があるため実行用exeを作っても良い。こいつまたpowershellで変なもの作ってるな。
変数_ipathに対象のフォルダを指定して実行すればok。powershell本体のps1ファイルがある場所に結果となるoutput.txtが保存され、そのtxtを自動で開く形にしている。ps1ファイルの場所を自動で取得する$PSScriptRoot変数は結構便利。ちなみにソース中の#はコメントだ。
今回のは指定フォルダ内のサブフォルダは取得対象外にしているが、サブフォルダも含めたい場合はget-childitemに-recurseオプションを付ければよい。また最終更新日はこのままだと時分まで取得するので、日付までで良い場合はToStringの箇所をyyyy/mm/ddとする。
オサレポイントは出力時に`tと、ファイル名と日時をタブ区切りにしているところか。丸ごとエクセルにコピペするとファイル名セルと日時セルに分かれるのでちょっと便利。そのほかにもGet-childitemはいろいろ取得できるので必要に応じて修正できる。
最後は取得したGet-childitemをパイプでout-fileで外部ファイルのoutput.txtに出力している。パイプは便利だが結構何が送られているのかを見逃しがちになるので使いどころには気を付けたい。と言いつつもGet-childitemで取得したフォルダの中身をパイプでForEach-Objectに送って全件ループ、みたいな書き方が結構便利。わざわざforでループ用変数作って…みたいなことをしなくて良いのが助かる。
以下ソースコード
$_ipath = ""
$_opath = $PSScriptRoot
Write-Host "$_ipath 直下のファイルの更新日時を取得します"
# ファイルの更新日時を取得してテキストの書き込み
# サブフォルダの中身を含めて取得するにはget-childitemに-recurseを付ける
# 更新日時が日付までで良い場合はToString以下をyyyy/mm/ddにする
Get-childitem -Path $_ipath -File | ForEach-Object {
$format_date = $_.LastWriteTime.ToString("yyyy/MM/dd HH:mm")
"$($_.Name)`t$format_date"
} | Out-File -filepath $_opath\output.txt
#結果ファイルを開く
invoke-item $_opath\output.txt
Write-Host "end"