PowerShell удаляет последние 3 символа из имени файла

Мне нужно рекурсивно переименовать кучу файлов с расширением «.cop» (для копирования) и избавиться от этой строки «.cop».

Я сделал следующую команду из прочитанного в теме get-help rename-item:

gci -r -i *.cop | Rename-Item -newname {$_.name -replace '\.cop',''}

но я получаю ошибку исключения ввода-вывода:

Rename-Item : Cannot create a file when that file already exists.

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

Спасибо


person Bluz    schedule 01.05.2012    source источник


Ответы (2)


Вам необходимо использовать командлет Foreach-Object:

gci -r -i *.cop | % {ren $_ -newname $_.Name.Replace(".cop", "") -whatif}
person Chris Gessler    schedule 01.05.2012
comment
Хороший Крис, большое спасибо. Последний вопрос, из любопытства, может ли кто-нибудь объяснить использование $ _. Name.Replace? Что это ? какая-то переменная-команда? Как Powershell называет их? Где я могу найти список, в котором показаны все возможные переменные (или как там он называется)? Ваше здоровье - person Bluz; 01.05.2012
comment
PowerShell - специальные символы и токены - neolisk.com/techblog/powershell-specialcharactersandtokens - person Chris Gessler; 01.05.2012
comment
Спасибо, Крис, но я не это имел в виду. Я знал о точках, я не просто не знаком с синтаксисом $ _. Var.command, например $ _. Name.Replace, и хотел посмотреть, есть ли список «команд», которые можно «прикрепить» к переменной, как вы сделали с $ _. Name.Replace. - person Bluz; 01.05.2012
comment
@Chris, foreach не нужен, rename-item должен принимать объекты из конвейера. - person zdan; 01.05.2012
comment
$ _ - это переменная, которая ссылается на объект FileSystemInfo, возвращаемый Get-ChildItem. Как и большинство объектов, он имеет свойства, одно из которых свойство строкового типа называется «Имя», которое также является объектом. У него тоже есть методы и свойства, одно из которых - Replace (). Чтобы обнаружить все возможные «команды», вам необходимо выяснить, какой объект возвращается, FileSystemInfo, String, Int32 и т. Д., А затем найти членов этого объекта в MSDN. msdn.microsoft.com/en -us / library / - person Chris Gessler; 01.05.2012

Ваш код работает на меня. Убедитесь, что у вас нет каталога с именем переименовываемого файла.

person Shay Levy    schedule 01.05.2012