2011-01-14 66 views
3

以下是問題:我想查詢subversion版本庫的版本號,然後創建一個新名稱(其名稱中帶有版本號)(例如,「Build763 「)。使用powershell從命令行輸出中提取特定值

命令「svn info」輸出一系列由冒號分隔的標籤\值對。例如

Path: c# 
URL: file:///%5Copdy-doo/Archive%20(H)/Development/CodeRepositories/datmedia/Development/c%23 
Repository UUID: b1d03fca-1949-a747-a1a0-046c2429f46a 
Revision: 58 
Last Changed Rev: 58 
Last Changed Date: 2011-01-12 11:36:12 +1000 (Wed, 12 Jan 2011) 

這是我現在的代碼,它解決了這個問題。有沒有辦法用較少的代碼做到這一點?我在想,如果使用管道,你可以用一兩行來做到這一點。我當然不應該使用臨時文件。

$RepositoryRoot = "file:///%5Cdat-ftp/Archive%20(H)/Development/CodeRepositories/datmedia" 
$BuildBase="/Development/c%23" 
$RepositoryPath=$RepositoryRoot + $BuildBase 

# Outputing the info into a file 
svn info $RepositoryPath | Out-File -FilePath svn_info.txt 

$regex = [regex] '^Revision: (\d{1,4})' 

foreach($info_line in get-content "svn_info.txt") 
    { 
     $match = $regex.Match($info_line); 
     if($match.Success) 
     { 
      $revisionNumber = $match.Groups[1]; 
      break; 
     } 
    } 


"Revision number = " + $revisionNumber; 

回答

3

這裏有一種方法:

$revisionNumber = svn info $RepositoryPath | 
    select-string "^revision" | 
     foreach {$_.line.split(":")[1].trim()} 

    if ($revisionNumber){"Revision number = " + $revisionNumber 

} 
2

以mjolinor的建議下,我終於有打算:

$revisionNumber = (svn info $RepositoryPath | select-string '^Revision: (\d+)$').Matches[0].Groups[1].Value 

酷!一行代碼。 (它花了兩個小時來寫,但嘿)

+1

他們讓你挖那個捕獲,不是嗎? – mjolinor

+1

那麼,你可以使用'(svn info $ RepositoryPath)-Replace'^ Revision:(\ d +)$','$ 1''來捕獲;) – Jaykul

+0

這樣更好。我必須記住這一點。 – mjolinor

0

如果你可以創建和使用URL的工作拷貝(WC),你可以

  • svnversion WC:將輸出乾淨號WC-修訂

    > svnversion trunk

    34

  • 隨着SubWCRrev將模板文件與SubWCRrev-keywords成蝙蝠文件(subwcrev WC tpl-file bat-file)與RevNo,在需要的位置取代(裏面的mkdir選項)和呼叫導致蝙蝠進行操作的
相關問題