Определите и выберите номер в имени каталога и используйте этот номер в выражении - PullRequest
1 голос
/ 11 марта 2019

Что мне нужно сделать, это создать переменную, которая может сделать ls каталога, найти каталоги с определенным соглашением об именах, определить наибольшее число в этих каталогах (каждый каталог заканчивается _#) и затем увеличьте это число на единицу, чтобы создать следующий каталог.

Например:

ls c:\ выходы:

c:\ABC
c:\foo1
c:\foo2

Мне нужно создать c:\foo3, поскольку c:\foo2 является самым высоким в настоящее время. Поэтому мне нужно определить, какой каталог является самым высоким, а затем создать новый каталог со следующим инкрементным номером.

У меня есть кусочки всей этой работы, но я не могу заставить ничего работать вместе.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вот моя попытка.Это может быть не так кратко, как ответ mklement0 , но я думаю, что он будет делать то, что вы хотите.

Он находит все папки с порядковым номером внутри данного пути (1 уровень) исоздает новые папки с тем же именем, но с большим конечным номером.

$path = 'C:\'                                                                           #'# (dummy comment to fix broken syntax highlighting)
Get-ChildItem -Path $path -Directory | 
    Where-Object { $_.Name -match '\d+$' } |               # find only folders with a name that ends in a number
    Group-Object -Property { $_.Name -replace '\d+$'} |    # group these folders by their name without the trailing number
    ForEach-Object {                                       # go through all the groups
        $baseName  = $_.Name                               # the group name is the base name for the new folder

        # get the name of the folder in the group with the highest number
        # create a new folder with the same base name and the next sequence number
        $lastUsed  = ($_.Group | Sort-Object {[int]($_.Name -replace $baseName)} -Descending | Select-Object -First 1).Name
        $nextIndex = [int]([regex]'\d+$').Match($lastUsed).Value + 1
        $newFolder = Join-Path -Path $path -ChildPath ('{0}{1}' -f $baseName, $nextIndex)

        Write-Host "Creating directory '$newFolder'"
        New-Item -Path $newFolder -ItemType Directory | Out-Null
    }

Поэтому, если у вас есть эти папки в корневом каталоге:

123ABC_1
bar1
foo1
foo2

Результат будет:

123ABC_1
123ABC_2
bar1
bar2
foo1
foo2
foo3
0 голосов
/ 11 марта 2019
$nextIndex = 1 + (
  (Get-ChildItem -Directory C:\foo*[0-9]).Name -replace '^.*\D' |
    Measure-Object -Maximum
).Maximum

New-Item -Type Directory C:\foo${nextIndex}
  • (Get-ChildItem -Directory C:\foo*[0-9]).Name возвращает имена всех каталогов в C:\, имена которых начинаются с foo и заканчиваются (как минимум) одной цифрой.

  • -replace '^.*\D' удаляет все, кроме числа в конце, из каждого имени.

  • Measure-Object -Maximum затем определяет максимум среди результирующих строк, состоящих только из цифр (PowerShell автоматически преобразуетстроки для чисел при определении максимума).

  • 1 + (...).Maximum, поэтому возвращает наибольшее число, в настоящее время внедренное в имена каталогов, увеличенное на единицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...