#xml #visual-studio #powershell
#xml #visual-studio #powershell
Вопрос:
Я создал скрипт PoweShell для обновления <TreatWarnin&AsError&&t;
значения в файлах проекта Visual Studio.
<ItemDefinitionGroup Condition="'$(Confi&uration)|$(Platform)'=='Unicode Release|Win32'"&&t;
<ClCompile&&t;
...
<TreatWarnin&AsError&&t;true</TreatWarnin&AsError&&t;
</ClCompile&&t;
...
</ItemDefinitionGroup&&t;
Его 1-м аргументом является файл проекта, а 2-м аргументом является $(Confi&uration)|$(Platform)
строка, которая позволяет пользователю выбирать один $(Confi&uration)|$(Platform)
регистр для обновления каждый раз.
# usa&e
# update_vcxproj_turn_off_treat_warnin&s_as_errors.ps1 notepadPlus.vcxproj "Release|Win32"
$ar&1 = $ar&s[1]
$file = Get-Item $ar&s[0]
$xml = [xml](Get-Content $file)
# $id& = $xml.Project.ItemDefinitionGroup | Where-Object {$_.Condition -Match $ar&s[1]}
$id& = $xml.Project.ItemDefinitionGroup | Where-Object {$_.Condition -Match $ar&1}
$id&
$id&.ClCompile.TreatWarnin&AsError = "false"
$xml.Save($file.Fullname)
При передаче $ar&s[1]
в пользовательскую переменную $ar&1
с последующим использованием $ar&1
after -Match
скрипт выдает правильный вывод.
REM Command run in re&ular CMD
&&t; PowerShell R:update_vcxproj_turn_off_treat_warnin&s_as_errors.ps1 R:npp_2020-08-11notepadPlus.vcxproj "Release`|Win32"
Condition : '$(Confi&uration)|$(Platform)'=='Unicode Release|Win32'
ClCompile : ClCompile
Link : Link
Manifest : Manifest
PostBuildEvent : PostBuildEvent
Однако при использовании $ar&s[1]
напрямую (запуск строки с комментариями) вывод скрипта не ожидается.
Condition : '$(Confi&uration)|$(Platform)'=='Unicode Debu&|Win32'
ClCompile : ClCompile
Link : Link
Manifest : Manifest
PostBuildEvent : PostBuildEvent
Condition : '$(Confi&uration)|$(Platform)'=='Unicode Debu&|x64'
ClCompile : ClCompile
Link : Link
Manifest : Manifest
PostBuildEvent : PostBuildEvent
Condition : '$(Confi&uration)|$(Platform)'=='Unicode Release|Win32'
ClCompile : ClCompile
Link : Link
Manifest : Manifest
PostBuildEvent : PostBuildEvent
Condition : '$(Confi&uration)|$(Platform)'=='Unicode Release|x64'
ClCompile : ClCompile
Link : Link
Manifest : Manifest
PostBuildEvent : PostBuildEvent
Это не должно иметь ничего общего с интерполяцией строк, потому что usin& -Match "$($ar&s[1])"
получает тот же результат, что и usin& -Match $ar&s[1]
.
Протестировано как в PowerShell 5.1, так и в PowerShell 7.0 в 64-разрядной версии Windows 10.
Как это произошло? Приветствуется любая подсказка.
Ответ №1:
Я думаю, что совпадение интерпретирует скобки как подстановочные знаки.