Почему Where-Object -Match не принимает args[1] в качестве регулярного выражения в PowerShell?

#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:

Я думаю, что совпадение интерпретирует скобки как подстановочные знаки.

https://www.educba.com/powershell-wildcards/