Мне нужно проанализировать файл VS2022 .vbproj, чтобы найти подробную информацию о конфигурации сборки. В powershell загружаю файл и пытаюсь добраться до нужного узла. Но я застрял в вводящих в заблуждение отчетах об ошибках PS и огромном количестве специальных символов, которые нужно экранировать...
Я ищу эту строку из .vbproj:
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
вот мой сценарий:
$xml = [xml](Get-Content $xmlFile)
$propertyGroup = $xml.SelectSingleNode("//PropertyGroup[@Condition= ""''`$(Configuration)|`$(Platform)'' == ''Debug|AnyCPU''""]")
if ($propertyGroup) {
Write-Host 'Element found.'
} else {
Write-Host 'Element not found.'
}
Что бы я ни делал, либо получаю либо синтаксические ошибки, либо "Элемент не найден"... Помогите пожалуйста!
Вы можете рассмотреть возможность обработки содержимого .vbproj не как XML, а как простой набор строковых строк. Тогда вам не придется иметь дело с экранированием XML, а можно просто искать целевые шаблоны с помощью фильтра регулярных выражений. Конечно, нет никакой гарантии, что файлы .vbproj имеют четко определенную структуру строк, но на самом деле она есть.
спасибо за ответы. @SiebeJongebloed, это всего лишь вопрос правильного экранирования одинарных, обратных и двойных кавычек вместе со знаком доллара, что необходимо сделать внутри другой строки (в двойных кавычках) XPath...
@Halfix, это именно то, о чем я думал с самого начала, но глупый ИИ посоветовал «проще всего проанализировать это в PowerShell»... Каждый раз, когда я прикасаюсь к «всемогущей» PowerShell, я сильно страдаю и возвращаюсь к другим способам действий. вещи. Я надеялся, что сегодня я наконец сделаю это, как рекомендует microfosft...
Использовать :
$xml.SelectSingleNode("//PropertyGroup[normalize-space(translate(@Condition,`"'$`",`"`"))='(Configuration)|(Platform) == Debug|AnyCPU']")
Мы экранируем символы " и $ и используем функцию translate
, чтобы сделать это только один раз.
Другой вариант с contains
и без экранирования:
$xml.SelectSingleNode("//PropertyGroup[contains(@Condition,'(Configuration)') and contains(@Condition,'(Platform)') and contains(@Condition,'Debug') and contains(@Condition,'AnyCPU')]")
Браво, спасибо! Оба варианта работают как шарм!
Может ли это быть проблема с пространством имен? Попробуйте заменить
//PropertyGroup
на//*[name()='PropertyGroup']