The Hard Way: 
$dbname="AdventureWorks"            
$Server="WIN7W510\R2"            
            
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null            
[System.reflection.assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended') | out-null            
$SMOserver = New-Object (’Microsoft.SqlServer.Management.Smo.Server’) -argumentlist $Server            
$db = $SMOserver.databases[$dbname]            
            
$cmdStatement="
$dbname"            
$cmdStatement+=foreach ($DFileGroups in $db.FileGroups)             
{            
foreach ($FGDFile in $DFileGroups.Files) {"
", $FGDFile.Name, $FGDFile.Size, $FGDFile.UsedSpace, $FGDFile.AvailableSpace, $FGDFile.FileName }            
}            
$cmdStatement+="
 "            
$cmdStatement+=foreach ($logFile in $db.LogFiles) {$logFile.Name, $logFile.Size, $logFile.UsedSpace, $logFile.AvailableSpace, $logFile.FileName }            
$cmdStatement            

SQLPSX to the rescue! 
Get-SqlDatabase "WIN7W510\R2" "AdventureWorks" | Get-SqlDataFile | Format-Table dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace;            
Get-SqlDatabase "WIN7W510\R2" "AdventureWorks" | Get-SqlLogFile | Format-Table dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace;            

Fixing the Array-Based Results that you get in PowerShell 
$ArrayResults = Get-SqlDatabase "WIN7W510\R2" "AdventureWorks" | Get-SqlDataFile |            
Select dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace;             
            
$ArrayResults.GetType()            

Without DataTable 
$DBinQuestion = Get-SqlDatabase "WIN7W510\R2" "AdventureWorks"             
            
$DBinQuestion | Get-SqlDataFile | Format-Table dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace;            
$DBinQuestion | Get-SqlLogFile  | Format-Table dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace;            

With DataTable 
$DBinQuestion = Get-SqlDatabase "WIN7W510\R2" "AdventureWorks"             
            
$DBinQuestion | Get-SqlDataFile | Select dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace | Out-DataTable            
$DBinQuestion | Get-SqlLogFile  | Select dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace | Out-DataTable            

Putting all of this in Motion 
$Instance = "WIN7W510\R2"            
            
foreach ($db in Get-SqlDatabase $Instance | Select Name)            
{            
$Results=Get-SqlDatabase $Instance $db.name | Get-SqlDataFile |            
Select Server, dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace, timestamp | Out-DataTable;            
            
$Results+=Get-SqlDatabase $Instance $db.name | Get-SqlLogFile |            
Select Server, dbname, FileGroup, FileName, Size, UsedSpace, FreeSpace, timestamp | Out-DataTable;            
            
Write-DataTable -ServerInstance $Instance -Database CentralInfo -TableName DatabaseFileFreeSpace -Data $Results;            
}