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