Использование функции в Powershell replace

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

$text = "the image is -12345-"
$text = $text -replace "-(d*)-", 'This is the image: '
Write-Host $text

это дает мне правильный результат: "Это изображение: 12345"

теперь я хочу включить кодированное изображение base64. Я могу прочитать изображение по id. Я надеялся, что сработает следующее, Но это не так:

function Get-Base64($path)
{
    [convert]::ToBase64String((get-content $path -encoding byte))
}
$text -replace "-(d*)-", "This is the image: $(Get-Base64 '')"

причина в том, что он не работает, потому что он сначала проходит (the строка, а не значение ) к функции, выполняет ее и только после этого выполняет замену. Что я хочу сделать, это

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

2 ответов


вы можете использовать static Replace метод [regex] класс:

[regex]::Replace($text,'-(\d*)-',{param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})

в качестве альтернативы вы можете определить regex объект и использовать Replace метод этого объекта:

$re = [regex]'-(\d*)-'
$re.Replace($text, {param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})

для лучшей читаемости вы можете определить функцию обратного вызова (scriptblock) в отдельной переменной и использовать ее в замене:

$callback = {
  param($match)
  'This is the image: ' + (Get-Base64 $match.Groups[1].Value)
}

$re = [regex]'-(\d*)-'
$re.Replace($text, $callback)

полезный ответ PetSerAl - это ваш единственный вариант в Windows PowerShell, по состоянию на У5.1.

PowerShell базовый v6.1 + теперь предлагает собственное решение PowerShell с помощью улучшения
-replace оператор
, что устраняет необходимость вызова [regex]::Replace():

$text -replace "-(\d*)-", { param($match) 
  "This is the image: $(Get-Base64 $match.Groups[1].Value)" 
}