Можно ли переименовать каждый файл в папке с другим именем с помощью powershell или пакетного файла?

#powershell #batch-file #cmd

#powershell #пакетный файл #cmd

Вопрос:

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

 (folder1)
image1.png
image2.png
image3.png

(folder2)
image1.png
image2.png
image3.png
  

Я хочу переименовать их с помощью командной строки, powershell или с помощью .bat для:

 (folder1)
B-Sign.png
B-Gauge.png
B-Cup.png

(folder2)
G-Sign.png
G-Gauge.png
G-Cup.png
  

Я намерен запускать команды для каждой папки, поскольку отличается только начало имени. Я хочу что-то простое.

 rename-item *.png B-Sign.png
rename-item *.png B-Gauge.png
  

Когда ему нужен другой префикс, я бы просто нашел и заменил префикс на новый, используя ctrl H в блокноте.

Проблема в том, что я не могу понять, ни в одном из них, как автоматически переключаться на следующий файл в папке вместо изменения имен всех файлов сразу. Кто-нибудь может помочь?

Ответ №1:

Да, это очень просто в PowerShell:

 Get-ChildItem "C:tempFolder1" |
Rename-Item -NewName { "B-"   $_.Name }
  

Новое имя является результатом выражения, которое Rename-Item знает, что нужно вычислять. Поскольку информация передается по конвейеру Rename-Item , команда выполняется один раз для каждого файла, в результате чего получаются имена, подобные вашему примеру.

Также вы можете использовать параметр фильтра, как вы описали, с помощью любого из приведенных ниже:

 Get-ChildItem "C:tempFolder1*.png" |
Rename-Item -NewName { "B-"   $_.Name }
  

Я предпочитаю фильтровать с помощью -Filter параметра:

 Get-ChildItem "C:tempFolder1" -Filter *.png |
Rename-Item -NewName { "B-"   $_.Name }
  

Вы также можете сохранить папку в переменной:

 $Folder = "C:tempFolder1"

Get-ChildItem $Folder -Filter *.png |
Rename-Item -NewName { "B-"   $_.Name }
  

Обновить:

В комментариях вот пример сопоставления списка префиксов с переименованиями, которые вы хотите сделать:

 $Prefix = 'B-'

$NewNames =
@(
    'Sign'
    'Guage'
    'Cup'
)

# If New names are stored ina file simply do:
# $NewNames = Get-Content <FilePath>

$Folder = "C:tempTest_10-30-20"

$Files = Get-ChildItem $Folder -Filter *.png

For( $i = 0; $i -lt $Files.Count;   $i )
{
    $CurrentFile = $Files[$i]
    $NewName = $Prefix   $NewNames[$i]   $CurrentFile.Extension
        
    Rename-Item $CurrentFile.FullName -NewName $NewName
}
  

Комментарии:

1. Каждый файл в каждой папке похож и может быть назван в порядке, от первого до последнего, одинаково. Проблема в том, что в папке 67 элементов, и у меня кистевой туннель, поэтому я намерен ввести каждое имя один раз в блокноте в команде powershell и вставить его в powershell для каждой папки. Переименовывает ли этот скрипт каждый файл таким образом, чтобы я мог перейти к следующему файлу, который я хочу переименовать?

2. Вопрос: Есть ли у вас фиксированное количество префиксов, означающих имена перед расширением. Если я отсортирую 67 файлов, то файл 1 должен быть назван в честь newname 1 . Это очень легко сопоставить, но это будет выглядеть иначе, чем указано выше.

3. Да, у меня есть фиксированное количество префиксов. Всего около 9, не превышающих 2 символа. Сценарий работает, но только для первого элемента, как бы я повторил его для следующих 66, не называя их одинаково?

4. Добавлен новый пример, но если у вас есть 9 префиксов sign, gauge, cup и т. Д… как вы решаете, какой из 67 получит какой префикс? Я могу удалить этот ответ и попросить вас уточнить ваш вопрос. Все можно сделать, но вы должны быть более понятными.

5. Каждое изображение, которое я просто называю в честь чего-то, у меня все в отдельных папках, отсортированных по цвету. Префикс в этом случае — B- или Синий. B-Gauge — это синий индикатор, потому что индикатор имеет синий цвет. Этот сценарий, который вы отправили, работает отлично!!