Я пытаюсь использовать 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
Любые идеи о том, как это сделать. Я не программист, и по этому поводу есть много данных, но у меня это не работает.
Спасибо за ваш ответ. Я использовал что-то вроде этого в цикле for: Rename-Item "$file" -NewName "$newName", но это не работает
Значит, это не сработало? Вы не должны использовать кавычки с вашими переменными, просто удалите их. Если после этого возникает проблема, вам нужно объяснить ее в своем вопросе, а не в разделе комментариев.
Что не работает? Вы получили ошибку, или это просто ничего не сделало? Как упоминалось выше, вы уже почти закончили, но вы также можете просто передать Rename-Item для более краткого решения.
Спасибо за ответ. Поскольку я не использовал это раньше, я пытаюсь разобраться в командлете Rename-Item и в том, как он работает. Я опубликую обновление, как я работаю над ним ... надеюсь.
Как уже объяснили оба комментатора, есть командлет 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 Вы можете пометить этот вопрос как выполненный, чтобы его было легче найти другим людям с похожим вопросом.
Вы можете переименовывать файлы с помощью Rename-Item. Вы уже сделали самое сложное, остальное легко