Пакетное замещение символов в именах файлов

#windows #powershell #cmd #file-rename #batch-rename

#Windows #powershell #cmd #файл-переименовать #пакетное переименование

Вопрос:

У меня около 600 видеофайлов со специальным символом $ в названии.

Я хочу пакетно заменить это буквой s.

Я нашел приведенный ниже код powershell в Интернете, и он отлично работает при замене букв другими буквами, но терпит неудачу при попытке заменить специальный символ $

 get-childitem -recurse | rename-item -newname { $_.name -replace "",""}
 

Я попытался использовать приведенный ниже код, и в итоге вместо замены типа файла добавляется символ s в конец

 get-childitem -recurse | rename-item -newname { $_.name -replace "$","s"}
 

$hortvid.mp4 становится $hortvid.mp4s вместо shortvid.mp4

Есть идеи о том, как заставить это работать правильно?

Комментарии:

1. Для повышения эффективности я настоятельно рекомендую включить фильтр, чтобы гарантировать, что вы передаете только те файлы, которые содержат этот символ в первом экземпляре. например gci -Filt *$* -File -Rec | rni …

Ответ №1:

Просто используйте escape-символ:

При запуске строки в каталоге:

 get-childitem -recurse | rename-item -newname { $_.name -replace "$","s"}
 

входной файл:

 $hortvid.mp4
 

выходной файл переименован:

 shortvid.mp4
 

Комментарии:

1. Возможно, вы можете объяснить, почему это работает для более полного ответа.

Ответ №2:

$ используется для указания переменной в powershell. И строка с двойными кавычками вычисляется в powershell следующим образом :

 $variable1="Hello"
$variable2="$variable1 world"
$variable2
 

если вы не хотите преобразовывать символ в строку с двойными кавычками, вы можете использовать обратную косую черту, как предлагаемое решение @lww. Или просто, вы можете использовать простую кавычку.
Вот так :

 Get-ChildItem -recurse | Rename-Item -Newname { $_.Name -replace '



, 's'}