Как добавить Add-Member в функцию «Format-Table», чтобы получить новый «MemberType» в Powershell? - PullRequest
0 голосов
/ 14 января 2020

Я не могу выбрать значения из объединенной таблицы. Я делаю два Oracle запросов. Затем я соединяю обе таблицы и вычисляю новые столбцы. Тогда я не могу выбрать рассчитанные значения.

Я подозреваю, что это как-то связано с "MemberType". Вновь рассчитанные столбцы не отображаются как «NoteProperty».

Может быть, кто-то знает хорошее решение?

$tablespace_raw = Invoke-SqlQuery -Query 'SELECT TABLESPACE_NAME, BLOCK_SIZE, CONTENTS from DBA_TABLESPACES' -Stream
Clear-SqlMessage
$tablespace_raw | Format-Table

TABLESPACE_NAME BLOCK_SIZE CONTENTS 
--------------- ---------- -------- 
SYSTEM                8192 PERMANENT
UNDOTBS1              8192 UNDO     
SYSAUX                8192 PERMANENT
TEMP                  8192 TEMPORARY
USERS                 8192 PERMANENT
BMS                   8192 PERMANENT

$tablespace_metrics_raw = Invoke-SqlQuery -Query 'SELECT TABLESPACE_NAME, USED_SPACE, TABLESPACE_SIZE from DBA_TABLESPACE_USAGE_METRICS' -Stream
Clear-SqlMessage
$tablespace_metrics_raw | Format-Table

TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE
--------------- ---------- ---------------
BMS                 538952         1024000
SYSAUX               55464         4194302
SYSTEM               65984         4194302
TEMP                     0          128000
UNDOTBS1              1440         4194302
USERS                    8           64000

$tablespace_raw | InnerJoin $tablespace_metrics_raw -On TABLESPACE_NAME | Format-Table -Property *, @{Name="USED_SPACE_Bytes";Expression={[double](($_.USED_SPACE) * ($_.BLOCK_SIZE))}}, 
                         @{Name="TABLESPACE_SIZE_Bytes";Expression={[double](($_.TABLESPACE_SIZE) * ($_.BLOCK_SIZE))}},
                         @{Name="TABLESPACE_Free_Percent";Expression={[int](($_.USED_SPACE) / ($_.TABLESPACE_SIZE) * 100)}}

TABLESPACE_NAME BLOCK_SIZE CONTENTS  USED_SPACE TABLESPACE_SIZE USED_SPACE_Bytes TABLESPACE_SIZE_Bytes TABLESPACE_Free_Percent
--------------- ---------- --------  ---------- --------------- ---------------- --------------------- -----------------------
SYSTEM                8192 PERMANENT      65984         4194302        540540928           34359721984                       2
UNDOTBS1              8192 UNDO            1440         4194302         11796480           34359721984                       0
SYSAUX                8192 PERMANENT      55464         4194302        454361088           34359721984                       1
TEMP                  8192 TEMPORARY          0          128000                0            1048576000                       0
USERS                 8192 PERMANENT          8           64000            65536             524288000                       0
BMS                   8192 PERMANENT     538952         1024000       4415094784            8388608000                      53

$tablespace_raw | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name            MemberType   Definition                    
----            ----------   ----------                    
Equals          Method       bool Equals(System.Object obj)
GetHashCode     Method       int GetHashCode()             
GetType         Method       type GetType()                
ToString        Method       string ToString()             
BLOCK_SIZE      NoteProperty decimal BLOCK_SIZE=8192       
CONTENTS        NoteProperty string CONTENTS=PERMANENT     
TABLESPACE_NAME NoteProperty string TABLESPACE_NAME=SYSTEM 


for($i=0;$i-le $tablespace_raw.length-1;$i++){
    $tablespace_raw[$i].TABLESPACE_NAME
    $tablespace_raw[$i].CONTENTS
    $tablespace_raw[$i].BLOCK_SIZE
    $tablespace_raw[$i].USED_SPACE_Bytes   -->> NOTHING!
    $i
}

1 Ответ

1 голос
/ 14 января 2020

Не думаю, что понимаю мотивацию выполнения SQL объединений на стороне клиента в коде PowerShell. Может быть, вам нужно добавить некоторые соображения для этого.

Но, не зная ничего другого об обстоятельствах, не будет ли намного проще позволить серверу БД вычислить эти значения?

$sql = '
SELECT
    ts.TABLESPACE_NAME,
    ts.BLOCK_SIZE,
    ts.CONTENTS,
    tsm.USED_SPACE,
    tsm.TABLESPACE_SIZE,
    tsm.USED_SPACE * ts.BLOCK_SIZE USED_SPACE_Bytes,
    tsm.TABLESPACE_SIZE * ts.BLOCK_SIZE TABLESPACE_SIZE_Bytes,
    /* casting to INT, otherwise Invoke-SqlQuery is unhappy */
    CAST(ROUND(tsm.USED_SPACE / tsm.TABLESPACE_SIZE * 100) AS INT) TABLESPACE_Free_Percent
FROM
    DBA_TABLESPACES ts
    INNER JOIN DBA_TABLESPACE_USAGE_METRICS tsm ON tsm.TABLESPACE_NAME = ts.TABLESPACE_NAME
'

$tablespace_info = Invoke-SqlQuery -Query $sql -Stream
foreach ($row in $tablespace_info) {
    $row.TABLESPACE_NAME
    $row.CONTENTS
    $row.BLOCK_SIZE
    $row.USED_SPACE_Bytes
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...