Замена имен файлов с раздельным выводом

Я пытаюсь использовать PowerShell для чтения имен файлов из каталога; затем в цикле for: разделять имена с помощью разделителя; сохранить желаемый результат в новой переменной. Теперь я хочу заменить исходные имена файлов в каталоге этой новой переменной. На данный момент я собрал следующее с ожидаемыми результатами:

$files = Get-ChildItem -Path C:\Test
write-output $files

Каталог: C:\Test

1_N04532L_LEFT.JPG
2_N04532R_RIGHT.JPG

Код продолжается

foreach ($file in $files)
{
   $nameArray = $file -split "_"
   $newName = $nameArray[1]
   write-output $newName
}

N04532L
N04532R

Любые идеи о том, как это сделать. Я не программист, и по этому поводу есть много данных, но у меня это не работает.

Вы можете переименовывать файлы с помощью Rename-Item. Вы уже сделали самое сложное, остальное легко

Santiago Squarzon 19.02.2023 01:24

Спасибо за ваш ответ. Я использовал что-то вроде этого в цикле for: Rename-Item "$file" -NewName "$newName", но это не работает

user1079898 19.02.2023 01:35

Значит, это не сработало? Вы не должны использовать кавычки с вашими переменными, просто удалите их. Если после этого возникает проблема, вам нужно объяснить ее в своем вопросе, а не в разделе комментариев.

Santiago Squarzon 19.02.2023 01:38

Что не работает? Вы получили ошибку, или это просто ничего не сделало? Как упоминалось выше, вы уже почти закончили, но вы также можете просто передать Rename-Item для более краткого решения.

Abraham Zinala 19.02.2023 01:40

Спасибо за ответ. Поскольку я не использовал это раньше, я пытаюсь разобраться в командлете Rename-Item и в том, как он работает. Я опубликую обновление, как я работаю над ним ... надеюсь.

user1079898 19.02.2023 01:55
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
0
5
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

# adding switch -File makes sure you do not also try to rename subfolders
$files = Get-ChildItem -Path 'C:\Test' -File  
foreach ($file in $files) { 
    $file | Rename-Item -NewName { '{0}{1}' -f ($file.BaseName -split '_')[1], $file.Extension }
}

Вы можете сократить это, передав результаты Get-ChildItem по одному в командлет Rename-Item. Поскольку мы передаем сюда объекты FileInfo, мы можем использовать автоматическую переменную $_

# enclose the Get-ChildItem cmd in brackets so this will enumerate the files to completion
# before passing them on to te Rename-Item cmdlet.
# if you don't, files you already have renamed could be picked up and processed again..
(Get-ChildItem -Path 'C:\Test' -File) | 
Rename-Item -NewName { '{0}{1}' -f ($_.BaseName -split '_')[1], $_.Extension }

Примечание: при переименовании файлов вы всегда можете столкнуться с коллизиями имен, при которых вы получите исключение

Оно работает! Большое спасибо. Это так полезно! Я пытался использовать командлет Rename-Item, но мне было трудно понять это, так как я не использую его на регулярной основе. Большое спасибо вам и предыдущим комментаторам за то, что указали мне правильное направление.

user1079898 19.02.2023 18:41

Спасибо @ user1079898 Вы можете пометить этот вопрос как выполненный, чтобы его было легче найти другим людям с похожим вопросом.

Theo 19.02.2023 19:19

Другие вопросы по теме