Как я могу изменить нумерацию файлов? - PullRequest
0 голосов
/ 15 мая 2019

Текущее состояние

У меня есть список файлов, которые нумеруются.Это пример (на самом деле файлов гораздо больше) :

01 File.sql
02 File.sql
02 another_file.sql
02 a_third_file.sql
03 File.sql
04 File.sql
.....

Желаемый результат

Как видите, файлы пронумерованы, но некоторые изфайлы имеют одинаковый номер.Что я хочу сделать, так это перебрать их все и изменить нумерацию, чтобы список выглядел примерно так:

01 File.sql
02 File.sql
03 another_file.sql
04 a_third_file.sql
05 File.sql
06 File.sql
07 File.sql
.....

Что я пробовал

Я придумалЭтот скрипт PowerShell, который работает в большинстве случаев:

$x = 1
Get-ChildItem "*.sql" | Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "}

Этот скрипт выполняет все файлы, удаляет их текущий номер и заменяет его на то, что я сохранил в $x.На данный момент единственной ошибкой в ​​моем скрипте является то, что все файлы получают номер 1, так как я нигде не увеличиваю его.

Так что к фактическому вопросу

Где в моем скрипте можетЯ увеличиваю $x?Или, может быть, мне нужно как-то переписать это как цикл, чтобы иметь возможность увеличивать его после каждого переименования?

Ответы [ 4 ]

2 голосов
/ 15 мая 2019

Я бы сказал, что быстрый и простой способ сделать это будет:

$x = 0
foreach ( $item in $( Get-ChildItem "PATH" "*.txt" ) ){
    $x++
    Rename-Item $item.fullName -newname $( $item.Name -replace '[0-9][0-9] ', "$x " )
}

Однако он не выполняет проверку ошибок, поэтому, если имя файла уже существует, произойдет ошибка для этого элемента.

Может быть, сделать две проверки, если вы нажмете какие-либо ошибки?Или добавьте IF (Test-Path ...) после $ x ++

* Редактировать - $ x изменено на 0, поэтому первое переименование будет 1

1 голос
/ 15 мая 2019

Вы можете использовать foreach с заменой и простым регулярным выражением для этого ... также Если вы хотите сохранить первые файлы с 0 до номера, например 01/02/03 до 10, я добавил для этого оператор if... надеюсь, это поможет

$i = 1
foreach ($file in Get-ChildItem C:\targetPath) # Change to valid path
{
    if ($i -lt 10) {
    Rename-Item $file.FullName -NewName "0$i $($file.BaseName -replace '^\d+\s').sql"
    }

    else {
    Rename-Item $file.FullName -NewName "$i $($file.BaseName -replace '^\d+\s').sql"
    }
$i++
}
0 голосов
/ 15 мая 2019

Чтобы собрать несколько советов:

  • Поскольку Rename-Item принимает конвейерный ввод, нет необходимости выполнять итерации с foreach.
  • поместите Get-ChildItem в круглых скобках , чтобы выполнить его первым и избежать искажения при изменении содержимого.
  • используйте подстановочный знак / диапазон для выбора старых чисел
  • закрепите заменяющее регулярное выражение в начале Имени с помощью каретки ^
  • используйте оператор формата -f , чтобы принудительно ввести два места при вставке нового номера
  • используйте $script:x / $global:x для обновления переменной внутри переименования {script block} about_scopes
    $x = 1
    (Get-ChildItem "[0-9][0-9] *.sql") | 
        Rename-Item -NewName {$_.Name -replace '^\d{2}', ("{0:D2}" -f $global:x++} -WhatIf

Если вывод выглядит нормально, уберите завершающий -WhatIf

0 голосов
/ 15 мая 2019

Обратите внимание, что вы можете использовать подстановочные знаки диапазона:

 Get-ChildItem '[0-9][0-9] *.sql'

Вы можете попробовать определить область действия переменной, если вы действительно хотите сделать это следующим образом:

 Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "; $global:x++} -whatif

Использовать скрипт вместо глобальногов сценарии.

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