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?