2013-04-27 10 views
6

git commitのエイリアスを作成しようとしており、メッセージも別のテキストファイルに記録されます。ただし、git commit"nothing to commit (working directory clean)"を返す場合は、別のファイルには何も記録しないでください。PowerShell関数で文字列比較が機能しません - 何が間違っていますか?

ここに私のコードです。 git commitエイリアスは機能します。ファイルへの出力が機能します。ただし、返されたメッセージが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 

私は-notcontainsオペレータは意味しないことのPowerShell 3.

答えて

7

$qはGitリポジトリのstdoutの各行の文字列配列が含まれています。 -notcontainsを使用するには、例えば、配列内のアイテムの完全な文字列に一致する必要があります:

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

をあなたは-match演算子を試し部分文字列一致をテストしたい場合。 (注 - これは、正規表現を使用して、一致した文字列を返す。)左のオペランドが配列の場合

$q -match "nothing to commit" 

-matchが動作します。だから、このロジックを使用することができます。

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

さらに別のオプションは、-like/-notlike演算子を使用することです。これらはワイルドカードを受け入れ、正規表現は使用しません。一致する(または一致しない)配列項目が返されます。だから、あなたもこのロジックを使用することができます。

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

"$ qには、gitのstdoutの各行の文字列配列が含まれています。" gitが2行以上の出力を生成する場合のみ。 gitがstdoutに1行しか出力しない場合、$ qは配列ではなく1つの文字列を含みます。 –

+0

OPからの複数の行がgit commit commit(私のマシンで試してみました)から返されます。 –

+1

私はそのツールを使用しないので、私はそれについてコメントすることはできません。しかし、この特定の答えは、コマンドラインツールの出力をキャプチャするすべてのケースに一般化することはできません。 –

3

にするだけのノートを使用しています「という文字列は、サブが含まれていません。」これは、 "collection/arrayにはアイテムが含まれていません"という意味です。

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

すなわち、使用が文字列の部分文字列が含まれている場合はtrue $を返すんStringオブジェクトの方法を、含まれています:「gitのコミット」コマンドは、単一の文字列を返す場合、あなたはこのような何かを試してみてください。

ビル

+0

の$ q'は、文字列配列(gitののstdoutからすべての行)が含まれて '...ので、' $ q.Contains(「コミットする何が」) 'は動作しません、 '$ q [1] .Contains(" ... ")'となります。 –

+0

私はすでに、「git commitコマンドが単一の文字列を返すかどうか」と言いました。 –