2009-06-05 20 views
5

Questa è una domanda newb totale. Powerhell amorevole, ma sicuramente non sto ottenendo qualcosa qui:parametri e funzioni di PowerShell

Sto creando una semplice funzione per replicare una stringa x volte. Sto riscontrando qualche strano problema con il parametro: non sembra che riconosca il secondo parametro.
Quando si esegue la funzione, restituisce una stringa vuota. Inoltre, penso che sia lumping i 2 parametri in 1. Ecco il mio codice:

 

Function Repeat-String([string]$str, [int]$repeat) { 
    $builder = new-object System.Text.StringBuilder 
    for ($i = 0; $i -lt $repeat; $i++) {[void]$builder.Append($str)} 
    $builder.ToString() 
} 

un primo momento ho DOT-fonte per caricarlo:
. .\RepeatString.ps1
poi eseguo in questo modo:
Repeat-string("x", 7)
I previsto una stringa di 7 x. Ho una stringa vuota.

Sono andato a frugare ancora un po ', e ho cambiato il ciclo "for". Ho sostituito la parte "-lt $ repeat" con "-lt 5", in modo da ottenere un numero fisso di ripetizioni. Quando ho fatto questo, ho ricevuto il seguente output (senza le virgolette):
Repeat-String ("x", 7)
"x 7x 7x 7x 7x 7"
Sembra come se fosse concatenando il $ str e $ repeat parametri invece di trattarli come 2 parametri separati. Qualche idea su cosa sto facendo male?

risposta

17

Il problema è che è necessario convertire il codice al seguente

Repeat-string "x" 7 

In PowerShell ogni volta che si mette un gruppo di valori all'interno (s ') si sta creando una matrice. Ciò significa che nell'esempio stai trasmettendo un array alla funzione come un singolo parametro.

+0

Grazie! Sapevo che stavo facendo qualcosa di stupido - non ero sicuro di cosa. – JMarsch

+0

@ JMarsch, tutti vengono intervistati da questo almeno una volta. E 'davvero fastidioso :( – JaredPar

+0

Odio questo! Ma ti ci abitui ... – Philippe

0

Naturalmente JaredPar ha ragione.

mi piace usare la funzione integrata gamma .. anche per questo: (notare comincio a 1 invece di 0)

Function Repeat-String([string]$str, [int]$repeat) { 
    $builder = new-object System.Text.StringBuilder 
    1..$repeat | %{ [void]$builder.Append($str) } 
    return $builder.ToString() 
} 

Repeat-string "x" 7 
+0

Grazie - non sapevo della funzione di intervallo. Dovrò inserire un libro su PowerShell nella mia lista di lettura. Immagino che a questo punto, potrei anche cercare/aspettare un libro di PowerShell 2.0) – JMarsch

6

Ecco un modo migliore, basta moltiplicare il vostro (qualsiasi) stringa N ripetizioni :

PS > function Repeat-String([string]$str, [int]$repeat) { $str * $repeat } 
PS > Repeat-String x 7 
xxxxxxx 

PS > Repeat-String JMarsch 3 
JMarschJMarschJMarsch 
+0

Ogni nuova cosa che apprendo su PowerShell mi mostra quanto è bello. Grazie per averlo condiviso, Shay +1 – JMarsch

+0

PowerShell ROCKS ;-) –

+0

In un certo senso, il commento di Shay Levy mostra che potremmo semplicemente usare la funzione "stringa multipla" ** invece ** di scrivere una funzione definita dall'utente. –

6

una nota cinesi proverbio:

"Dare un uomo un pesce e y dargli da mangiare per un giorno Insegnagli a pescare e lo nutrirai per tutta la vita."

Per il cosmopolita di mente in mezzo a voi, l'originale è 授人以魚不如授人以漁 e la romanizzazione Pinyin è Shòu rén yǐ yú bùrú shòu rén yǐ yú. (ho imparato a parlare un'infarinatura di mandarino e scrivere Pinyin quindi devo esercitarmi! Stranamente ho trovato che l'espressione di Pinyin di cui sopra sembrava essere un enigma, ma questa è una storia per un'altra volta ... :-)

Ora al mio punto : JMarsch si imbatté in una comune trappola PowerShell che rischia di far inciampare chiunque sia abituato a lingue "convenzionali" e @JaredPar ha fornito la risoluzione corretta. Presumo, tuttavia, che la risposta è simile a schiaffeggiare un pesce davanti a voi!

Appena pubblicato su Simple-Talk.com, Down the Rabbit Hole: A Study in PowerShell Pipelines, Functions, and Parameters discute la trappola sopra descritta insieme a molte altre sfumature dell'interfaccia chiamata-funzione. Una sezione del mio articolo, ad esempio, copre le sottili differenze tra tutte le seguenti chiamate alla funzione f, la maggior parte delle quali non produce ciò che si aspetta.

f(1,2,3) 
f (1,2,3) 
f 1,2,3 
f (1 2 3) 
f 1 2 3 

Cerca il download PDF del riferimento pratico a muro che accompagna anche l'articolo.

Ecco una miniatura: PowerShell Functions Quick Reference

(Oh, e si consiglia di controllare anche la lista dei umoristici spin-off della citazione di cui sopra classico a Give a man a fish...)

+0

Ottimo articolo. Grazie per questo. – crush

+0

Cosa c'entra il pesce con esso? :) – bgmCoder

Problemi correlati