пакетное переименование с использованием windows powershell - PullRequest
2 голосов
/ 28 марта 2020

Я занят сценарием windows powershell для пакетного переименования группы папок с идентификаторами, который прекрасно работает. У меня вопрос: как добавить проверку, чтобы все идентификаторы были уникальными, когда все мои файлы были переименованы? Вот код:

    param(    
    [Parameter(Mandatory=$true)]
    [int]$idx
)

Get-ChildItem *.sql | Foreach-Object {
 $iPrefix = ('{0:d5}' -f $idx)
 $path = (Split-Path -Path($_))
 $filename = (Split-Path -Path($_) -Leaf) -replace "\[|\]",""
 #%{ write-host $path}
 %{ write-host $filename}

 if(!$filename.StartsWith("script","CurrentCultureIgnoreCase"))
 { 
     #%{ write-host "Script$iPrefix - $filename"}
     Rename-Item -LiteralPath(($_)) -NewName("Script$iPrefix - $filename")
     ++$idx
     %{ write-host "Renamed: " + $filename}
 }
}

Вот скриншот того, чего я хочу избежать: Renamed Folders

Как видите, Script02185 повторяется дважды потому что скрипт запускался в два разных раза. Как я могу гарантировать, что номера останутся уникальными?

1 Ответ

1 голос
/ 29 марта 2020

Попробуйте это.

$files = Get-ChildItem . -Filter *.sql

$prefixedFiles, $unprefixedFiles = $files.Where({ $_.Name -match "^Script\d{5} - " }, 'split')

$usedIDs = [int[]]$prefixedFiles.Name.Substring(6, 5)
$unusedIDs = [System.Collections.Generic.HashSet[int]](1..99999)
$unusedIDs.ExceptWith($usedIDs)

$enumerator = $unusedIDs.GetEnumerator()

$unprefixedFiles | Rename-Item -NewName {

    if (!$enumerator.MoveNext()) { throw "`nThere are no unused IDs." }
    "Script{0:D5} - {1}" -f $enumerator.Current, ($_.Name -replace '\[|\]')

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