Avvertenze di formattazione degli oggetti personalizzati per non confondere gli utenti finali

2

Visualizzazione predefinita degli oggetti nella console di Windows PowerShell

In PowerShell hai documenti format.ps1xml. Questi sono usati per semplificare cosa e come i dati dell'oggetto vengono mostrati all'utente finale. Un semplice esempio di default sarebbe Get-Process . Se non vengono richieste modifiche, per impostazione predefinita verrà visualizzata la seguente proprietà impostata ..

Get-Process | Select -first 1

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName                  
-------  ------    -----      ----- -----   ------     --  -- -----------                  
    172      12   197960     208444   309 1,464.52 701036   1 7zG    

Tuttavia un System.Diagnostics.Process ha molte altre proprietà ad esso associate ( Get-Process | gm -MemberType Property ). Inoltre, l'esempio precedente ha NPM(K) che non è una proprietà reale. Puoi vedere come è derivato dal file di formato seguente: DotNetTypes.format.ps1xml (La posizione comune per trovare questo sarebbe: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0)

<View>
    <Name>process</Name>
    <ViewSelectedBy>
        <TypeName>System.Diagnostics.Process</TypeName>
    </ViewSelectedBy>
    <TableControl>
        <TableHeaders>
            ...
            <TableColumnHeader>
                <Label>NPM(K)</Label>
                <Width>7</Width>
                <Alignment>right</Alignment>
            </TableColumnHeader>
            ...
        </TableHeaders>
        <TableRowEntries>
            <TableRowEntry>
                <TableColumnItems>
                    ....
                    <TableColumnItem>
                        <ScriptBlock>[long]($_.NPM / 1024)</ScriptBlock>
                    </TableColumnItem>
                    ....
        </TableRowEntries>
    </TableControl>
</View>

Quindi quella colonna è in realtà una proprietà calcolata basata su NPM. La maggior parte dei cmdlet comuni fa cose come questa come un favore all'utente finale (citazione necessaria). I dati grezzi sono ancora lì se sai come trovarli ma la formattazione di output predefinita dovrebbe essere solo una rapida occhiata alle informazioni importanti / familiari.

Potevo vedere alcuni utenti confondersi nel tentativo di richiedere una proprietà che non esiste in base alla tabella che avevano inizialmente. (Get-Process)."NPM(K)" non mostrerebbe nulla.

Formato personalizzato.ps1xml

Ho un modulo che sto facendo che si basa sul recupero di un sito di acquisto e vendita locale. Un elenco di ricerca avrà proprietà multiple come le informazioni sul numero di risultati di ricerca, l'URL associato della ricerca e i post o elenchi effettivi associati alla ricerca.

Cercando il modo migliore per entrare nel vivo del problema, ho un metodo chiamato .hasMorePages() . Se c'è più elenchi da visualizzare allora cosa è in questa ricerca questo metodo restituirà true. Normalmente questo non viene visualizzato nell'output in quanto è un metodo e non una proprietà. Posso usare un file format.ps1xml personalizzato per rendere visibile questo. Quanto segue è solo un frammento del file più grande.

.....
<ListItem>
    <Label>Has More Pages</Label>
    <ScriptBlock>if($_.hasMorePages()){"Yes"}else{"No"}</ScriptBlock>
</ListItem>
....

Quindi vedresti qualcosa di simile nello standard output per la variabile di ricerca:

Requested URL              : .....obfuscated
FirstListingResultIndex    : 1
LastListingResultIndex     : 20
TotalNumberOfSearchResults : 84
Has More Pages             : Yes
Listings                   : {Toys/Games for Sale, RARE HiltonHeadopoly MONOPOLY Game with 
                             Hilton Head Landmarks, Clue and Monopoly (Halifax version), 
                             Assorted Monopoly Games-Various Prices...}

Quindi Has More Pages : Yes mostra esattamente come l'ho definito. Sono preoccupato che questo violi una sorta di "Princial of least surprise". Se provassi ad isolare quella variabile, non funzionerebbe. $searchListing."Has More Pages" sarebbe nullo in quanto non è la proprietà. Quindi sembra bello in uscita ma non è la proprietà reale. Questo è solo un esempio che ho fatto allo scopo di scrivere questa domanda. Questo potrebbe essere mitigato creando una proprietà alias con lo stesso nome in modo che punti a hasmorepages() ma che mostrerebbe un valore booleano e non il yes / no

Nel caso di Get-Process mi aspetto che questo sia vero in quanto ho familiarità con il modo in cui PowerShell opera e funziona. Non mi aspetto lo stesso per i cmdlet personalizzati.

Per quanto interessanti siano le direttive di formattazione personalizzate c'è una sorta di mantra che dovrei provare a seguire dove posso provare e mantenere le cose semplici inizialmente senza nascondere o confondere gli utenti su dove si trovano le proprietà e i dati reali?

    
posta Matt 08.01.2018 - 18:30
fonte

1 risposta

2

As cool as making custom formatting directives are is there some sort of mantra I should try to follow where I can try and keeps things simple initially while not hiding or confusing users about where the real properties and data are?

Genera un file di aiuto per il modulo utilizzando uno strumento come PlatyPS :

PlatyPS provides a way to:

Scrivi PowerShell External Help in Markdown Genera aiuto markdown (esempio) per i tuoi moduli esistenti Tieni aggiornato il markdown con il tuo codice

E aggiungi del testo al file della guida:

Che descrive come vedere ciò che è realmente lì:

The default formatter can mislead, but format-list or using get-member commandlet will list all the properties.

e utilizza PSScriptAnalyzer per ulteriori informazioni.

Riferimenti

risposta data 17.08.2018 - 17:21
fonte

Leggi altre domande sui tag