полезный ответ js2010 указывает на потенциальную проблему с вашим подходом (.\\
должно быть \.\\
), кратко демонстрирует необъяснимое поведение, которое вы испытали (для которого они создали Проблема GitHub ) и предлагает обходной путь (вставка | % Line
).
Для более непосредственного решения вашей проблемы:
# Inputs are sample paths.
'.\foo\Nuget\deleteme.txt',
'.\bar\QC_OH_DARKESol\deleteme.txt' |
foreach { if ($_ -match '^\.\\([^\\]+)') { $Matches[1] } }
Из приведенного выше получаются следующие строки:
foo
bar
То есть извлекает первый компонент пути после литерала .\
из путей ввода, используя foreach
(ForEach-Object
) для применения -match
, оператор сопоставления регулярных выражений для каждой входной строки, результаты сопоставления которого отражены в автоматической переменной c $Matches
, равной га sh таблица , чья запись 0
является общим соответствием, с записью 1
, содержащей значение 1-й группы захвата, 2
2-й, ...; названные группы захвата (например, (?<root>...)
), если они есть, имеют записи по имени (например, root
).
Альтернативой является использование switch
оператор с опцией -Regex
:
switch -Regex (
git diff --name-only origin/master feature/foo | Resolve-Path -Relative
) {
'^\.\\([^\\]+)' { $Matches[1] }
}