переименовать части имени файла в 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"
    }

person freakostudent    schedule 23.07.2018    source источник


Ответы (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"
    }
}
person kuujinbo    schedule 23.07.2018

Чтобы сосредоточиться только на том, как одна операция -replace может достичь желаемого преобразования:

$n = 'Ben_sucksatpowershell_2018_07Rename-Item21_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'
}
person mklement0    schedule 24.07.2018