2013-04-27 20 views
6

Ayrıca, iletiyi ayrı bir metin dosyasına kaydeden git commit bir takma ad oluşturmaya çalışıyorum. Ancak, git commit, "nothing to commit (working directory clean)" değerini döndürürse, ayrı bir dosyaya hiçbir şey KAYDETMEMELİDİR.String karşılaştırma PowerShell işlevinde çalışmıyor - ne yapıyorum yanlış?

İşte kodum. git commit diğer adı çalışır; dosyaya çıkış çalışması. Ancak, git commit'dan neyin geri döndüğü önemli değil, iletiyi günlüğe kaydeder.

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 

Ben PowerShell 3.

cevap

7

$q seyahatseverlerin Git en Stdout'a her satırı bir dize dizisi içerir. -notcontains kullanmak için örneğin dizide bir öğenin tam dizeyle eşleşen gerekir:

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

Eğer -match operatörü kullanmayı deneyin kısmi dize maç için test etmek istiyorum. (Not - bu normal ifadeler kullanır ve eşleşen bir dize döndürür.) Sol işlenen bir dizi olup olmadığını

$q -match "nothing to commit" 

-match çalışacaktır.

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

Henüz başka seçenek -like/ -notlike operatörlerini kullanmaktır: Yani bu mantığı kullanabilirsiniz. Bunlar joker karakterleri kabul eder ve normal ifadeler kullanmaz. Eşleşen (veya eşleşmeyen) dizi öğesi iade edilir. Yani bu mantığı kullanabilirsiniz:

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

"$ q, git'in stdoutunun her satırında bir dizi dizisi içerir." Sadece git, birden fazla çıktı üretiyorsa. Git yalnızca bir satırı stdout'a gönderirse, $ q bir dizi değil, bir diziyi (cevabımda not ettiğim bir şey) içerecektir. –

+0

Birden çok satır, OPs git commit commit denir (makinemde denendi). –

+1

Bu aracı kullanmıyorum, bu yüzden yorum yapamam. Ama sadece bu özel cevabın, komut satırı aracının çıktısını almanın tüm durumlarına genelleştirilemeyeceğine işaret etmek istedim. –

3

anlamına gelmez operatörü -notcontains sadece Not kullanıyorum "dizesi bir alt içermiyor." "Koleksiyon/dizi bir öğe içermiyor" anlamına gelir. komutu tek bir dize döndürür "git commit" Eğer böyle bir şey deneyebilirsiniz: bir dize bir alt içeriyorsa

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

yani gerçek $ çıkmıyor dize nesnesinin yöntemini içerir kullanmak .

Bill

+0

'$ q' bir dize dizisi (GIT en stdout'ta tüm satırları) ... yani' $ q.Contains ("hiçbir şey işlemek için") içeren 'çalışmaz , '$ q [1] .Contains (" ... ")' Ancak. –

+0

Zaten "git komutu 'komutu tek bir dizge döndürürse" dediğimde zaten belirttim. –

İlgili konular