Переименовать файлы Powershell добавить скобки - PullRequest
0 голосов
/ 05 января 2020

У меня есть разные файлы, которые теперь называются 455668446854, например, каждый файл имеет свой номер. Что мне нужно сделать, это переименовать файл в это: [455] [668] [446854]

Каков наилучший способ сделать это с помощью powershell? У меня есть пара 100 файлов в одном каталоге, которые нужно преобразовать.

Ответы [ 3 ]

2 голосов
/ 05 января 2020

Вы можете сделать следующее, если вы находитесь в каталоге, содержащем файлы:

Get-ChildItem -Path .\[0-9]*[0-9] -File |
   Where Name -match '^\d+$' |
       Rename-Item -NewName {$_.Name -replace '(\d{3})(\d{3})(\d+)','[$1][$2][$3]'} -WhatIf

Удалите параметр -WhatIf для выполнения операции переименования.

Объяснение:

Параметр Get-ChildItem -Path поддерживает подстановочные знаки. Цель .\[0-9]*[0-9] - заглянуть в текущий каталог (.) и найти элементы, которые начинаются и заканчиваются цифрой. -File возвращает только файлы. Это просто сводит к минимуму работу более неэффективного оператора Where.

^\d+$ - это выражение регулярного выражения, используемое в данном случае в сочетании с оператором -match. Это просто означает возврат файлов с именами, которые начинаются (^) с одного или нескольких (+) чисел (\d) и заканчиваются ($) после этих чисел.

Name или BaseName свойство должно соответствовать здесь, так как у вас нет расширений файлов в вашем сообщении. Если у вас есть расширения файлов, то вместо этого нужно будет использовать свойство BaseName.

Операция -replace заменяет три числа (\d{3}), три числа и оставшиеся числа, заключенные в квадратные скобки. каждая группа. Поскольку мы используем () вокруг механизмов регулярных выражений, мы создаем группы захвата с именами 1,2,3, начиная слева направо. Строка замены позволяет нам в несколько ограниченных пределах манипулировать (Windows PowerShell только из-за того, что в Core имеется больше опций) выводом.

0 голосов
/ 05 января 2020

Вы ищете метод подстроки Вы можете попробовать это:

Get-ChildItem -Path "FolderPath" | Foreach {
  $p1 = $_.Name.ToString().SubString(0,3)
  $p2 = $_.Name.ToString().SubString(3,3)
  $p3 = $_.Name.ToString().SubString(6,6)
  Rename-Item -Path $_ -NewName "`[$($p1)`]`[$($p2)`]`[$($p3)`]"
}
0 голосов
/ 05 января 2020

это просто работа со строками ... вам нужно будет работать со свойством .BaseName, если вы используете реальные fileinfo объекты. он использует и дефисы [более безопасные для имен файлов, чем скобки] и скобки. [ ухмылка ]

код демонстрирует 3 метода в виде списка комментариев.

$InStuff = '111222333333'

'using the "-f" format string operator ...'
'{0:###-###-######}' -f [int64]$InStuff
'{0:[###][###][######]}' -f [int64]$InStuff
'=' * 30
'using the "-replace" operator with a regex pattern ...'
$InStuff -replace '(\d{3})(\d{3})(\d{6})', '$1-$2-$3'
$InStuff -replace '(\d{3})(\d{3})(\d{6})', '[$1][$2][$3]'
'=' * 30
# do the insert last-first to avoid changing the the insert position
'using the ".Insert()" string method ...'
$InStuff.Insert(6, '-').Insert(3, '-')
$InStuff.Insert(12, ']').Insert(6, '[').Insert(6, ']').Insert(3, '[').Insert(3, ']').Insert(0, '[')
''

вывод ...

using the "-f" format string operator ...
111-222-333333
[111][222][333333]
==============================
using the "-replace" operator with a regex pattern ...
111-222-333333
[111][222][333333]
==============================
using the ".Insert()" string method ...
111-222-333333
[111][222][333333]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...