2013-04-27 10 views
6

Sto provando a creare uno pseudonimo di git commit che registra anche il messaggio in un file di testo separato. Tuttavia, se git commit restituisce "nothing to commit (working directory clean)", NON deve registrare nulla nel file separato.Il confronto delle stringhe non funziona nella funzione PowerShell - cosa sto facendo male?

Ecco il mio codice. L'alias git commit funziona; l'output su file funziona. Tuttavia, registra il messaggio indipendentemente da ciò che viene restituito da git commit.

function git-commit-and-log($msg) 
{ 
    $q = git commit -a -m $msg 
    $q 
    if ($q –notcontains "nothing to commit") { 
     $msg | Out-File w:\log.txt -Append 
    } 
} 

Set-Alias -Name gcomm -Value git-commit-and-log 

sto usando PowerShell 3.

risposta

7

$q contiene una matrice di stringhe di ogni riga di stdout di Git. Per utilizzare -notcontains è necessario corrispondere alla stringa completa di un elemento dell'array, per esempio:

$q -notcontains "nothing to commit, working directory clean" 

Se si desidera verificare per una partita stringa parziale provare l'operatore -match. (Nota - usa le espressioni regolari e restituisce una stringa che ha trovato.)

$q -match "nothing to commit" 

-match funziona se l'operando sinistro è un array. Così si potrebbe usare questa logica:

if (-not ($q -match "nothing to commit")) { 
    "there was something to commit.." 
} 

Un'altra opzione è quella di utilizzare gli operatori -like/-notlike. Questi accettano caratteri jolly e non usano espressioni regolari. Verrà restituito l'elemento dell'array che corrisponde (o non corrisponde). Così si potrebbe anche usare questa logica:

if (-not ($q -like "nothing to commit*")) { 
    "there was something to commit.." 
} 
+1

"$ q contiene una serie di stringhe di ogni riga di gdd stdout." Solo se git produce più di una riga di output. Se git emette solo una riga su stdout, $ q conterrà una singola stringa, non una matrice (qualcosa che ho notato nella mia risposta). –

+0

Più righe vengono restituite dagli OPs commit commit git (provato sul mio computer). –

+1

Non uso quello strumento, quindi non posso commentare in merito. Ma volevo solo sottolineare che questa risposta specifica non può essere generalizzata a tutti i casi di acquisizione dell'output di uno strumento da riga di comando. –

3

Solo una nota che il -notcontains operatore non significa "stringa non contiene una sottostringa." Significa che "la raccolta/matrice non contiene un elemento". Se il "git commit" comando restituisce una singola stringa, si potrebbe provare qualcosa di simile:

if (-not $q.Contains("nothing to commit")) 

cioè, utilizzare il Contiene metodo dell'oggetto String, che fa ritorno $ true se una stringa contiene una sottostringa .

Bill

+0

'$ q' contiene una matrice di stringhe (tutte le linee da stdout di Git) ... in modo da' $ q.Contains ("niente a commettere") 'non funzionerà , '$ q [1] .Contains (" ... ")' tuttavia. –

+0

Ho già notato che quando ho detto "se il comando 'git commit' restituisce una singola stringa". –

Problemi correlati