Условно заменить строку в файле PowerShell - PullRequest
0 голосов
/ 05 марта 2020

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

$test = Get-Content C:\temp\test.txt
$test -replace ($compname, $fqdn)

По сути, мне нужно заменить, если и только если строка соответствует имени compname, но не соответствует FQDN.

Есть предложения? Спасибо!

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Первый параметр - это регулярное выражение, поэтому вы хотите сопоставить значение $compname, которое не встречается до доменной части полного доменного имени. Вы можете добиться этого с помощью Negative Lookahead :

$domain = [regex]::Escape( $fqdn.split( '.', 2 )[1] )
$test -replace "${compname}(?!${domain})", $fqdn

Давайте разберем, что это делает:

  • $domain = [regex]::Escape( $fqdn.split( '.', 2 )[1] ) - Извлечение доменной части Полное доменное имя и убедитесь, что оно экранировано, чтобы никакие специальные символы не интерпретировались как синтаксис регулярных выражений
  • "${compname}(?!\.${domain})" - Шаблон регулярного выражения для сопоставления - давайте разберем это
    • ${compname} - Вставьте $compname переменная как часть строки
    • \. - совпадение с литералом .; backsla sh требуется, поскольку . является специальным токеном (соответствует любому символу) при обработке регулярных выражений
    • () - Сгруппированное выражение - давайте также разберем это
      • ?! - Оператор отрицательного предпросмотра, сообщает сгруппированному выражению, что эта группа не может соответствовать после предыдущего выражения. При совпадении эта группа исключается из результата.
      • ${domain} - То же, что и ${compname}, просто вставляя переменную в выражение
1 голос
/ 05 марта 2020

Regex к спасению!

"(computer)(?!\.contoso\.com)"

Вы хотите сопоставить имя "компьютера" и использовать отрицательный взгляд вперед, чтобы игнорировать те, которые уже имеют часть FQDN.

$test = Get-Content C:\temp\test.txt
$test -replace "($compname)(?!\.contoso\.com)", $fqdn
0 голосов
/ 05 марта 2020

Я нашел способ перезаписать всю строку вместо замены имени компа.

$match = $test | select-string -pattern "serverName"
$test -replace $match,"serverName = $fqdn" | set-content c:\temp\test.txt

Это гарантирует, что запись будет перезаписана полным доменным именем.

...