#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 — это синий индикатор, потому что индикатор имеет синий цвет. Этот сценарий, который вы отправили, работает отлично!!