изменить имя нескольких файлов только для части имени файла - PullRequest
0 голосов
/ 08 мая 2019

У меня есть 50 файлов с именами файлов в формате:

SIGMOID 01012019 - 01082019.XLS
SIGMOID 01012019 - 01022019.XLS

Я хотел бы изменить его на:

SIGMOID_01012019 - 01082019.XLS
SIGMOID_01012019 - 01022019.XLS

Я хочу обновить часть имени файла и добавить подчеркивание вместо первого пробела в имени.

Спасибо

Я пытался написать скрипт в powershell

dir |
Where-Object { $_.name.Contains(" ") } |
Rename-Item -NewName { $_.name -replace " ","_" }

но это обновляет каждый пробел.

Ответы [ 4 ]

0 голосов
/ 08 мая 2019

Умм, как насчет замены дважды:

'SIGMOID 01012019 - 01082019.XLS' -replace ' ','_' -replace '_-_',' - '

SIGMOID_01012019 - 01082019.XLS

или (заменить пробел без черты с обеих сторон):

'SIGMOID 01012019 - 01082019.XLS' -replace '[^-] [^-]','_'

SIGMOI_1012019 - 01082019.XLS

Попробуйте переименовать элемент -whatif ...

0 голосов
/ 08 мая 2019

Предположим, у вас есть файлы вроде:

SIGMOID 01012019 - 01082019.XLS
SIGMOID 01012019 - 01022019.XLS
SOMETHINGELSE    01012019 - 02022019.XLS
YETANOTHERPREFIX 01012019 - 03022019.XLS

тогда следующий код переименует их:

$sourceFolder = 'THE PATH OF THE ROOTFOLDER THAT STORES THE XLS FILES TO RENAME'   #'#  enter your rootpath here
Get-ChildItem -Path $sourceFolder -File | 
    Where-Object { $_.Name -match '^\w+ +\d{8}.*\.xlsx?' } | 
    ForEach-Object { 
        $_ | Rename-Item -NewName ($_.Name -replace '^(\w+) +(\d{8}.*\.xlsx?)', '$1_$2') -WhatIf
    }

стать

SIGMOID_01012019 - 01082019.XLS
SIGMOID_01012019 - 01022019.XLS
SOMETHINGELSE_02012019 - 01022019.XLS
YETANOTHERPREFIX_03012019 - 01022019.XLS

Примечание: удалите -WhatIf, если вы довольны результатами

Сведения о регулярном выражении:

^           Assert position at the beginning of a line (at beginning of the string or after a line break character)
(           Match the regular expression below and capture its match into backreference number 1
   \w       Match a single character that is a “word character” (letters, digits, etc.)
      +     Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)           
\           Match the character “ ” literally
   +        Between one and unlimited times, as many times as possible, giving back as needed (greedy)
(           Match the regular expression below and capture its match into backreference number 2
   \d       Match a single digit 0..9
      {8}   Exactly 8 times
   .        Match any single character that is not a line break character
      *     Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   \.       Match the character “.” literally
   xls      Match the characters “xls” literally
   x        Match the character “x” literally
      ?     Between zero and one times, as many times as possible, giving back as needed (greedy)
)
0 голосов
/ 08 мая 2019

Превращаю мой комментарий в ответ,

Разделите имя только на первый пробел и добавьте подчеркивание
'* *' гарантирует, что в имени файла есть хотя бы один пробел.

Get-ChildItem '* *' | 
     Rename-Item -NewName {($_.Name -split ' ',2 -join '_')} -Whatif

Если вывод выглядит нормально, удалите -WhatIf

При последующих запусках это изменит - в ваших примерах на _- и т. Д.

Для предотвращения этого вам понадобится Where-Object, который исключает файлы с подчеркиванием.

Get-ChildItem '* *' | 
  Where-Object Name -notmatch '^\S+_' |
     Rename-Item -NewName {($_.Name -split ' ',2 -join '_')} -Whatif
0 голосов
/ 08 мая 2019

Возможно, не самое элегантное решение, но, возможно, именно то, что вы ищете:

Rename-Item -NewName { $_.name -replace "SIGMOID ","SIGMOID_" }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...