/ / Zastępowanie przez częściowe dopasowanie nie działa - regex, powershell, replace

Zastępowanie przez częściowe dopasowanie nie działa - regex, powershell, replace

Muszę zastąpić ścieżkę lokalną zgodnie z "C: Program FilesPath" ze zdalną ścieżką "PCC $ Program FilesPath". Zbudowałem regexp dla tego w następujący sposób:

$path -replace "^(?<ddd>w):","\$($pc.name)${ddd}`$"

The $path zawiera ścieżkę pobraną z rejestru i jest znana jako poprawna ścieżka. Testuję tą ścieżką: C:Program FilesPath. Z jakiegoś powodu nie udało się pobrać poprawnej ścieżki, brakuje jej nazwy. Rezultat jest zawsze taki: \MY_PC$Program FilesPath. Testowanie za pomocą $matches zwróć to:

if ($path -match "^(?<ddd>w):") {$matches}
Name                           Value
----                           -----
ddd                            C
0                              C:

Oznacza to, że wyrażenie regularne jest dopasowane i $matches jest poprawnie wypełniony. nadziewanie $1 zamiast ${ddd} Tak też nie działa. Co więc robię źle i jak naprawić to dziwne zachowanie?

PS: Muszę zachować oba $($pc.name) i ${ddd} w jednym regex zastępującym. Użycie pojedynczych cudzysłowów w drugim wyrażeniu powoduje poprawną zamianę litery dysku, ale blokuje zastąpienie nazwy komputera.

Odpowiedzi:

0 dla odpowiedzi № 1

Rozwiązanie wykorzystywało podwójne cudzysłowy dlaregex, ale aby uciec przed znakiem dolara, który poprzedza nazwę grupy zamiennej z backtick. Powodem jest to, że łańcuch zostaje poddany podwójnej analizie, pierwszy silnik Powershell używa znaków dolara, aby zastąpić go analizowanymi ciągami, drugi silnik regex używa składni znaku dolara do zastosowania grup zastępczych. Dlatego też, aby znak pierwszego dolara przetrwał analizę pierwszego etapu i poprawnie zastąpiony dopasowanym regionem, konieczne jest ucieczkę znaku dolara. Prawidłowe polecenie jest następujące:

$path -replace "^(?<ddd>w):","\$($pc.name)`${ddd}`$"

Na marginesie, jeśli chcesz użyć obugrupy zastępcze, PowerShell ocenił ciągi znaków i umieszczenie znaku dolara w wynikowym łańcuchu gdzieś, ale pod koniec wymiany, musisz użyć dwóch uciekinierów:

$path -replace "1","`$`$1" # replaces "1" with "$1" literally