#getBoxFiles.ps1
#created by mikebai 2021/07/15 jpfocus.com
$topFolderId = "0"
$topFolderName = "BoxTop"
# https://developer.box.com/reference/get-folders-id-items/
# https://developer.box.com/reference/resources/file/#param-content_created_at
# file info props > https://developer.box.com/reference/get-files-id/#response-example
$urlTemplate = "https://api.box.com/2.0/folders/{0}/items?fields=name,id,type,created_by,created_at,modified_at,modified_by&limit=100000"
$devToken = "xxxxxxxxxxxxxxx" # you can get dev token id from > https://app.box.com/developers/console
$formatter1 = "yyyy_MM_dd"
$formatter2 = "yyyy_MM_dd__HH_mm_ss"
$formatter3 = "yyyy/MM/dd HH:mm:ss"
$scriptFolder = split-path -parent $MyInvocation.MyCommand.Definition
$tabTag = "`t"
$Headers = @{}
$Headers = @{"Authorization" = "Bearer $devToken" }
function getFiles {
param (
[Parameter(Mandatory = $true)]
[ValidateNotNull()]
[string]$parentFolderId,
[Parameter(Mandatory = $true)]
[ValidateNotNull()]
[string]$parenFoldertName,
[Parameter(Mandatory = $true)]
[ValidateNotNull()]
[Int32]$layerLevel
)
$url = $urlTemplate -f $parentFolderId
$fileInfoList = Invoke-RestMethod -Method Get -Uri $url -Headers $Headers
if ( $null -eq $fileInfoList -or $null -eq $fileInfoList.entries -or 0 -eq $fileInfoList.entries.Length) {
Write-Host "not found."
return
}
foreach ($fileInfo in $fileInfoList.entries) {
$ftype = $fileInfo.type
$fid = $fileInfo.id
$fname = $fileInfo.name
$created_by = $fileInfo.created_by.name;
$modified_by = $fileInfo.modified_by.name;
#todo dt convert failed
# $created_at = $($fileInfo.created_at).ToString($formatter3)
# $modified_at = $($fileInfo.modified_at).ToString($formatter3)
$created_at = $fileInfo.created_at
$modified_at = $fileInfo.modified_at
$itemLink = ""
$parentFolderLink = ""
if ("folder" -eq $ftype) {
Write-Host "item type > folder"
$itemLink = "https://app.box.com/folder/${fid}"
$parentFolderLink = "https://app.box.com/folder/${parentFolderId}"
}
elseif ("file" -eq $ftype) {
Write-Host " item type > file"
$itemLink = "https://app.box.com/file/${fid}"
$parentFolderLink = "https://app.box.com/folder/${parentFolderId}"
}
elseif ("web_link" -eq $ftype) {
Write-Host " item type > web_link``"
$itemLink = "not supported"
$parentFolderLink = "https://app.box.com/folder/${parentFolderId}"
}
else {
Write-Host "unknown item type > $ftype"
$itemLink = "https://app.box.com/file/${fid}"
$parentFolderLink = "https://app.box.com/folder/${parentFolderId}"
}
$ary = @($fid, $ftype, $fname, $layerLevel.ToString(), $itemLink, $created_by, $created_at, $modified_by
, $modified_at, $parentFolderId, $parenFoldertName, $parentFolderLink)
$lineStr = $ary -join $tabTag
$lineStr | Out-String | Out-File $csvResultFileName -Encoding utf8 -Append -NoNewline
if ("folder" -eq $ftype) {
getFiles -parentFolderId $fid -parenFoldertName $fname -layerLevel $($layerLevel + 1)
}
}
}
try {
$dtNowStart = $(Get-Date)
# [string]$csvResultFileName = "${scriptFolder}\\boxfiles-$($dtNowStart.ToString($formatter2)).csv"
[string]$csvResultFileName = "${scriptFolder}\\boxfiles-$($dtNowStart.ToString($formatter1)).csv"
$itemLink = "https://app.box.com/folder/${topFolderId}"
$ary = @("exec time", $dtNowStart.ToString($formatter3))
$lineStr = $ary -join $tabTag
$lineStr | Out-String | Out-File $csvResultFileName -Encoding utf8 -NoNewline
$ary = @("fid", "ftype", "fname", "layerLevel", "itemLink", "created_by", "created_at", "modified_by", "modified_at", "parentFolderId", "parenFoldertName", "parentFolderLink")
$lineStr = $ary -join $tabTag
$lineStr | Out-String | Out-File $csvResultFileName -Encoding utf8 -NoNewline -Append
$ftype = "topfolder"
$fid = $topFolderId
$fname = $topFolderName
$created_by = "-"
$created_at = "-"
$modified_by = "-"
$modified_at = "-"
$layerLevel = 0;
$itemLink = "https://app.box.com/folder/${fid}"
$ary = @($fid, $ftype, $fname, $layerLevel, $itemLink, $created_by, $created_at, $modified_by, $modified_at, $parentFolderId, $parenFoldertName, $parentFolderLink)
$lineStr = $ary -join $tabTag
$lineStr | Out-String | Out-File $csvResultFileName -Encoding utf8 -NoNewline -Append
getFiles -parentFolderId $topFolderId -parenFoldertName $topFolderName -layerLevel 1
Write-Host "exec finished > $csvResultFileName"
}
catch {
Write-Host $_.exception.message
Write-Output $_.exception.message
}