#powershell #rename #pipeline
#powershell #переименовать #трубопровод
Вопрос:
Я пытаюсь переименовать кучу файлов с помощью powershell, удалив префикс (который одинаков во всех файлах), заменив » » пробелом и установив для оставшегося значения регистр заголовка. Вот что у меня есть на данный момент:
Where-Object { $_ -Match '^Website.com_ ' } |
ForEach-Object
{
$_ |
Rename-Item -NewName {$_.Name -replace 'Website.com_','' -replace ' ',' '};
Rename-Item $_.Fullname (Get-Culture).TextInfo.ToTitleCase($_)
}
Первое переименование работает, оно удаляет и форматирует файлы должным образом, но затем второе переименование говорит, что элементы не существуют, что заставляет меня думать, что я должен просто передать их в другой цикл foreach в другом канале, но, похоже, я тоже не могу заставить это работать.
Похоже, что наличие 2 переименований на самом деле не работает, и я попытался использовать регистр заголовка с заменой, но, похоже, это тоже не работает.
Ответ №1:
Было бы проще создать имя в 2 этапа, а затем сделать Rename-Item
что-то вроде приведенного ниже, чтобы сделать то, что вам нужно
Where-Object { $_ -Match '^Website.com_ ' } |
ForEach-Object {
$BaseName = ($_.Name -replace 'website.com','' -replace ' ','')
$FinalName = (Get-Culture).TextInfo.ToTitleCase($BaseName)
Rename-Item $_.FullName -NewName $FinalName
}
Комментарии:
1. Это говорит мне о том, что в строке с Rename-Item есть недопустимые символы.
2. Я не вижу, какова будет точная ошибка, но я думаю, что она действительно пытается изменить имя файла. Ошибка: Переименовать элемент: недопустимые символы в пути
Ответ №2:
$_
в вашем ForEach-Object
цикле есть снимок элемента — он не будет динамически меняться, чтобы следовать тому, что вы делаете с базовым файлом. При переименовании элемента $_
отображается старое имя. Итак, когда вы попытаетесь выполнить второе переименование на основе $_.FullName
, Rename-Item
ничего не найдете.
Потенциальным решением вашей проблемы «установки остатка в регистр заголовка» было бы, вне цикла, выполнить другой Get-ChildItem
поиск всего, что попадает в это условие, а затем переименовать их по отдельности.
Комментарии:
1. Я хотел бы выбрать элементы, уже находящиеся в конвейере, возможно ли это? Потому что я думаю, что get-ChildItem выберет другие файлы с общим расширением, которые я не обязательно хотел бы переименовывать
2. Проблема в том, что, похоже , ваш
ForEach-Object
цикл улавливает все файлы, которые вы хотите переименовать — казалось бы, у вас должен быть какой-то другой запрос, чтобы перехватить остальные?
Ответ №3:
Наконец-то нашел что-то, что работает:
$path = "G:DownloadsChrometest2"
$items = (Get-ChildItem -Path $path -File *.mp4 |
Where-Object { $_ -Match '^Website.com_ ' } |
ForEach-Object{
$_ |
Rename-Item -NewName {$_.Name -replace 'Website.com_','' -replace ' ',' '} -PassThru
})
$items | % {
Rename-Item -Path $_.FullName -NewName (Get-Culture).TextInfo.ToTitleCase($_.Name)
}
Спасибо всем, кто пытался мне помочь!