Powershell脚本查找所有svn工作副本

发布于 2024-12-29 05:10:30 字数 469 浏览 1 评论 0原文

我想编写 powershell 脚本来将所有工作副本从 1.6 svn 升级到 1.7。 问题是找到指定子目录中的所有工作副本,并在每个工作副本的第一个匹配处停止。该脚本可以找到嵌套在工作副本中的所有 .svn 目录,包括子目录:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.FullName -match ".svn$"}|Select-Object FullName

是否有任何选项可以在目录中的第一个匹配项上停止 Get-ChildItem,并停止递归子目录 处理?有什么提示可以看吗?

另一个选项是获取输出结果,并根据父\子目录关系使用某种逻辑对列表进行排序\过滤。在我看来,这是一种更令人困惑的方式,但它也是一种选择......

I would like to write powershell script to upgrade all working copies from 1.6 svn to 1.7.
The problem is to find all working copies in specified subdirectory and stop on first match for each one. This script could find all .svn directories including subdirs,nested in working copy:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.FullName -match ".svn$"}|Select-Object FullName

Is there any option to stop Get-ChildItem on first match in directory, and cease recurse subdirs processing ? Any hints to look at ?

Another option is to get output results and sort\filter the list with some logic, based on parent\child dir relations. A bit more confusing way, imo, but its also an option...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫离伤花 2025-01-05 05:10:30

我找到了适合这种管道的过滤条件。

$prev = "^$"

Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" `
| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`
| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

它类似于正则表达式反向引用,并在管道过滤器内按预期工作。

I found proper filtering condition for such pipeline.

$prev = "^$"

Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" `
| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`
| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

It's similar to regex backreference and work as expected inside pipeline filter.

十六岁半 2025-01-05 05:10:30

您可以使用break。这是一些例子:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer } | % {
    if ($_.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}

或者稍微不同的方式:

$dirs = Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer }
foreach ($dir in $dirs) {
    if ($dir.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}

You can use break. Here's some examples:

Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer } | % {
    if ($_.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}

Or a slightly different way:

$dirs = Get-ChildItem -Recurse -Force -Path "d:\Projects\" | ? {$_.PSIsContainer }
foreach ($dir in $dirs) {
    if ($dir.FullName  -match ".svn$") {
        # 1. Process first hit
            # Code Here... 
        # 2. Then Exit the loop
            break
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文