Переименовать части имени файла в powershell

У меня есть имя файла "Ben_sucksatpowershell_2018_07_13_21_22_07.txt" Я пытаюсь переименовать этот файл в "b.20180713.b"

Для сценария, который я пишу, мне нужно переименовать серию этих файлов, и новое имя должно основываться на оригинальном yyyy_MM_dd в исходном имени файла

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

Foreach ($Slave in $Slaves)
{
$ProcessedPath = "\\$Server\Directory\Processed\"
$ProcessedSlave = "$ProcessedPath\$Slave\"
    If (!(Test-Path $ProcessedSlave))
    {
        Copy-Item -Path $Eticket -Destination $ProcessedPath -Force
        ren $Eticket  -NewName {$_.Name -replace ("Ben_sucksatpowershel_", "b.") | (".txt",".b")} #of course, this doesn't work though.

    }
    Else 
    {
         Write-Host "Potato"
    }

2 ответа

Решение

Предполагая, что у вас есть коллекция имен файлов, в примере ниже массива $filenames, вы можете использовать простое регулярное выражение, чтобы соответствовать исходному yyyy_MM_dd, а затем заменить подчеркивание:

foreach ($filename in $filenames) {
    if ($filename -match '.*_(\d{4}_\d{2}_\d{2})_.*') {
        # $matches is a special / built-in PowerShell variable:
        # 1. $matches[0] => full regex match
        # 2. $matches[1] => first capturing group
        # 3. $matches[n] => nth capturing group
        $newName = "b.$($matches[1].Replace('_', '')).b";
        # remove -WhatIf when you're ready
        ren $filename  -NewName $newName -WhatIf;
    } else {
        Write-Warning "[$filename] does not match expected pattern"
    }
}

Чтобы сосредоточиться только на том, как один -replace Операция может достичь желаемой трансформации.

$n = 'Ben_sucksatpowershell_2018_07_13_21_22_07.txt'
$n -replace '^Ben_sucksatpowershell_(\d{4})_(\d{2})_(\d{2})_.*?\.txt$', 'b.$1$2$3.b'

Вышеуказанные выходы:

b.20180713.b
  • Обратите внимание, как регулярное выражение разработано, чтобы соответствовать всему входу (^...$), так что выражение замены заменяет его полностью

  • Захват групп ((...)) используются для извлечения интересующих подстрок, которые упоминаются по порядку в выражении замены ($1 для 1-й группы захвата, $2 для 2-го...); \d представляет одну цифру, и {<n>} представляет точно <n> повторы).

  • Для краткости, оставшиеся токены во входе перед расширением имени файла (_.*?) явно не совпадают, но вы можете легко добавить это.

Предполагая, что остальная часть вашего кода работает как задумано, измените ваш ren (Rename-Item) позвоните следующим образом:

Rename-Item $Eticket -NewName {
  $_.Name -replace '^Ben_sucksatpowershell_(\d{4})_(\d{2})_(\d{2})_.*?\.txt$', 'b.$1$2$3.b'
}
Другие вопросы по тегам