構成
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

コメント