[PowerShell]フォルダサイズの取得

PowerShell

構成

C:.
│  Config.txt
│  Main.ps1
│
├─.vscode
│      launch.json
│
├─log
│      directoryslist-test-コンピュータ名-20240703 094411.log
│
└─result
        20230702 185449.csv

実装内容


# 管理者権限で実行
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) 
{
  Start-Process powershell.exe "-ExecutionPolicy RemoteSigned -File `"$PSCommandPath`"" -Verb RunAs
  exit
}

# 変数
$username   = $env:USERNAME
$hostname   = hostname
$datetime   = Get-Date -f 'yyyyMMddHHmmss'
$logdir     = "$PSScriptRoot/log/"
$logfilename   = "${username}-${hostname}-${datetime}.log"

# ログ出力開始
Start-Transcript "${logdir}${logfilename}"

Write-Host @"
*********************************************************
*
* 指定したディレクトリの容量取得
* バージョン : 1
* 作成者 : user
* 作成日 : 2023/07/02
* 更新日 : 2023/07/02
*
*********************************************************
"@ -ForeGroundColor green

Write-Host "$(Get-Date -Format g) 実行中のユーザ : " $username

# 設定ファイルの読み込み
Write-Host "$(Get-Date -Format g) 設定ファイル読み込み : $($PSScriptRoot)/Config.txt"
$config = (Get-Content "$PSScriptRoot/Config.txt" -Encoding UTF8) -as [string[]]

# 設定ファイルの行>=1の場合
if($config.Length -ge 1 ){
  # ループ処理
  $config | ForEach-Object {
    $config_line = $_

    # -LiteralPath を指定することでワイルドカード文字も通常の文字列として解釈
    # パスの存在の確認
    if( Test-Path -LiteralPath $config_line){

      # PowerShell - Scripting.FileSystemObject を使用する
      $FSO = New-Object -ComObject Scripting.FileSystemObject 
      $objFS = $FSO.GetFolder($config_line)

      [PSCustomObject]@{

        "Path"            = $config_line
        "FolderName"      = $objFS.Name
        "Size(Bytes)"   = $objFS.Size
        "Size(KB)"      = [math]::Round($objFS.Size / 1KB, 2)
        "Size(MB)"      = [math]::Round($objFS.Size / 1MB, 2)
        "Size(GB)"      = [math]::Round($objFS.Size / 1GB, 2) 
        "作成日時"        = $objFS.DateCreated
        "更新日時"        = $objFS.DateLastModified
        "最終アクセス日時" = $objFS.DateLastAccessed

      }

    } else {
      $get_config_line = @{ text = "指定した【"+ $config_line +"は見つかりません" + "`r`n" + "確認して再度実行してください。"}
      Write-Host $get_config_line
    }

  # } | Format-Table -AutoSize
  } | Export-CSV `
  "$PSScriptRoot/result/${datetime}.csv" `
  -Encoding UTF8 `
  -NoTypeInformation   
  
} else {
  Write-Host "設定ファイル【Config.txt】の確認をお願いします。"
  Write-Host $Error
}

# "directoryslist-${username}-${hostname}-${datetime}.log"以外の logファイルを削除
Remove-Item "${logdir}\*" -Exclude ${logfilename} -Recurse
Write-Host "$(Get-Date -Format g) ${logfilename} 以外ファイルを削除"

# ログ出力終了
Stop-Transcript

参考サイト

New-Object による COM オブジェクトの作成
https://learn.microsoft.com/ja-jp/powershell/scripting/samples/creating-.net-and-com-objects–new-object-?view=powershell-5.1
https://www.itlab51.com/?p=6014

PSFolderSizeによる実行方法もあるようですが、ためした方もいいかも
https://www.powershellgallery.com/packages/PSFolderSize/1.7.1
https://www.gngrninja.com/script-ninja/2016/5/24/powershell-calculating-folder-sizes

ファイル操作
https://www.sammaya.jp/vbscript/path

コメント