ho imparato da questo StackOverflow question, che PowerShell
la semantica di ritorno sono diversi diciamo dalla semantica di ritorno C#
s'. Citazione dalla domanda di cui sopra:Come restituire uno e un solo valore da una funzione di PowerShell?
PowerShell ha una semantica di ritorno davvero stravagante, almeno se vista da una prospettiva di programmazione più tradizionale. Ci sono due idee principali su cui riflettere: tutto l'output viene catturato e restituito. La parola chiave return indica solo un punto di uscita logico. sguardo
Let questo esempio:
function Calculate
{
echo "Calculate"
return 11
}
$result = Calculate
Se echo $result
vi renderete conto che qualcosa non va. Ci si aspetterebbe questo:
11
Ma la realtà, ciò che in realtà si vede, è diverso:
Calculate
11
Così, invece di tornare solo il valore di reintroduzione, è effettivamente ottenere indietro un array.
È possibile eliminare le istruzioni echo e non inquinare il valore restituito, ma se si chiama un'altra funzione dalla funzione, che fa eco a qualcosa, allora si è di nuovo nei guai.
La mia domanda è, come posso scrivere una funzione PowerShell
, che restituisce una sola cosa. Se le funzioni integrate PowerShell
restituiscono un solo valore, perché non posso farlo?
La soluzione che sto usando ora e mi piacerebbe per sbarazzarsi di:
function Calculate
{
#Every function that returns has to echo something
echo ""
return 11
}
#The return values is the last value from the returning array
$result = (Calculate)[-1]
'+ 1' per informazioni davvero utili. '-1' per non fornire una soluzione manutenibile, ma invece che implica lo status quo è accettabile: *" Pertanto, è responsabilità dell'utente, come autore della funzione, capire ogni chiamata di funzione/cmdlet all'interno della propria funzione: in particolare, restituisce qualsiasi cosa, sia un vero valore di ritorno o solo un output diagnostico? "* - persone seriamente? Quanto è pazzo? Devo sapere se qualche cosa chiamo * potrebbe * fornire informazioni diagnostiche ad un certo punto? Pfff. –
Oh e potrei aggiungere, il commento non è stato quello di prenderti in giro. Piuttosto, penso di condividere il sentimento espresso da [poster Byron laggiù] (http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/#comment-112182) a http : //www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ –
Apprezzo la tua frustrazione, Martin. :-) Tuttavia, potrei suggerire che non è così male come sembra. I cmdlet di Microsoft o altre fonti commerciali non diffonderanno gli output diagnostici su willy-nilly; Ho aggiunto quella parte per essere a conoscenza dei tuoi cmdlet _own_. La parte che devi veramente ricordare è i valori di ritorno dei cmdlet. Tuttavia, come con qualsiasi API, è necessario comprendere i cmdlet che si stanno utilizzando, sia i parametri che prendono sia i valori restituiti, se presenti. –