使用PowerShell从命令行输出中提取特定值

3
这里是问题:我想查询Subversion仓库的版本号,然后创建一个带有版本号的新目录(例如“Build763”)。命令“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;
4个回答

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
这样就好了。我得记住这个。 - mjolinor
@Jaykul: 只有当“(svn info $RepositoryPath)”返回一行时才有效。我已经尝试过,你只会得到带有版本号的那一行,但是你也会得到所有其他行(URL、仓库ID等)。 - Andrew Shepherd
你说得对。你需要做一些事情来摆脱其他字符串... 例如,先使用Select-String或将它们连接成一个字符串(例如:"$()")并在两端使用.*,如: "$(svn info $RepositoryPath)" -Replace '.*Revision: (\d+).*','$1' - Jaykul
1
你可以更加简化这段代码:(svn info $RepositoryPath | select-string "^Revision").ToString().Split(":")[1].Trim() - Mike D

2

0

如果您能创建和使用URL的Working Copy (WC),则可以

  • svnversion WC: 将输出WC-revision的干净数字

    > svnversion trunk

    34

  • 使用SubWCRrev将模板文件与SubWCRrev-keywords转换为bat文件(subwcrev WC tpl-file bat-file),将RevNo替换到需要的位置(在mkdir选项内),并调用生成的bat文件执行操作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接