Ошибка переименования элемента PowerShell

Я узнал о переименовании Powershell несколько лет назад, пытаясь удалить часть -eng в конце файлов .srt для сериалов. Нашел эту команду, которая отлично работала, когда мне нужно было переименовать десятки файлов.

get-childitem *.srt | foreach {rename-item $_ $_.name.replace("-eng","")}

Это единственная известная мне команда. Я просто ничего не знаю ни о PowerShell, ни о программировании. Теперь, например, у меня есть эти файлы.

  • Мастера меча онлайн II - 01 [BD] [FS] .mp4
  • Мастера меча онлайн II - 02 [BD] [FS] .mp4

24 из них. Идея состоит в том, чтобы получить такой результат

  • 02 - 01.mp4
  • 02 - 02.mp4

и Т. Д.

Так что мне нужно заменить.

Sword Art Online II --> 02

и

[BD][FS] --> ""

Думал, что это будет не так сложно. Но у меня ошибки. Например я пробовал

get-childitem *.mp4 | foreach {rename-item $_ $_.name.replace("Sword Art Online II ","")}

Но я получаю эту ошибку

rename-item : Cannot rename because item at 'C:\users\santo\downloads\02\Sword Art Online II - 01 [BD][FS].mp4' does
not exist.
At line:1 char:32
+ ...  | foreach {rename-item $_ $_.name.replace("Sword Art Online II ","") ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Итак, я попробовал с последней частью, но получаю ту же ошибку

rename-item : Cannot rename because item at 'C:\users\santo\downloads\02\Sword Art Online II - 01 [BD][FS].mp4' does not exist.
At line:1 char:32
+ ... item *.mp4 | foreach {rename-item $_ $_.name.replace(" [BD][FS]","")}
+                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Я считаю, что нахожусь в правильном каталоге, потому что я ввожу команду dir, и она перечисляет все 24 файла с помощью компакт-диска и компакт-диска .. Использование Windows Powershell (администратор) Пытался найти строку с ошибкой. Что это означает PSInvalidOperationException Я просто не знаю, во что я ввязываюсь.

Что я делаю неправильно? Есть предположения?


person Nickie Sanx    schedule 04.11.2020    source источник
comment
Спасибо marsze за редактирование поста. Теперь выглядит очень хорошо.   -  person Nickie Sanx    schedule 04.11.2020


Ответы (2)


Прежде всего, обратите внимание, что вам не обязательно находиться в правильном каталоге. Вы можете указать путь для Get-Childitem напрямую через параметр -Path (или -LiteralPath). (См. Документацию .)

Кроме того, Rename-Item ожидает имя файла. Если вы передадите $_, который имеет тип FileInfo, он будет неявно преобразован в строку, в результате будет получено только имя файла, а не полный путь. Это может привести к ошибкам, если вы не в правильном каталоге. Вы можете использовать $_.FullName. Или, что еще лучше, вы можете передать результаты прямо в команду.

Наконец, похоже, что ваш -Filter ошибается. Разве это не должно быть *.mp4?

Вот моя обновленная версия команды. Дайте мне знать, если это сработает или у вас есть вопросы

Get-ChildItem -Path "C:\users\santo\downloads" -Filter *.mp4 |
    Rename-Item -NewName {$_.Name.Replace("Sword Art Online II", "02").Replace(" [BD][FS]", "")}

Примечание. Всегда сначала включайте переключатель -WhatIf, чтобы проверить, что команда будет работать, прежде чем вы ее действительно запустите. Это поможет вам устранить неполадки и предотвратить нежелательные изменения.

(Это выглядело бы так: ... | Rename-Item -WhatIf -NewName ...)

Если вам нужна помощь с какой-либо командой, вы всегда можете использовать -? (например, Rename-Item -?) или использовать командлет Get-Help (например, Get-Help Rename-Item или Get-Help Rename-Item -Examples)

person marsze    schedule 04.11.2020
comment
Это сработало на удивление идеально. Большое спасибо за улучшение команды. Нашел несколько руководств в этой сети. stackoverflow.com/questions/33559/ Как ты думаешь, это хорошо для начинающего? - person Nickie Sanx; 04.11.2020
comment
@NickieSanx Рад, что это помогло. Не стесняйтесь проголосовать + принять этот ответ. Также см. Мою правку об использовании Get-Help. Если вы хотите изучить PowerShell, вы можете использовать учебник по PowerShell Google или аналогичный, и вы найдете множество хороших статей, например этот. Кроме того, вы также можете вернуться сюда, если вы застряли. - person marsze; 04.11.2020

Не используйте ForEach, напрямую направьте его в Rename-Item:

dir "C:\users\santo\downloads" -filter *.mp4 | 
  ren -NewName {$_.Name.Replace('Sword Art Online II', '02').Replace(' [BD][FS]', '')}

Если вы все еще хотите использовать Foreach:

dir -filter *.mp4 | 
  % {ren $_.fullname -newname {$_.name.replace("Sword Art Online II ","").Replace(' [BD][FS]', '')}}
person programmer365    schedule 04.11.2020
comment
Большое спасибо, сэр. Сработало очень-очень хорошо. Знаете ли вы какие-нибудь руководства для начинающих, чтобы понять, как работает PowerShell? - person Nickie Sanx; 04.11.2020