5

Я пытаюсь переименовать несколько файлов, имена которых заканчиваются одинаково. Эти файлы в настоящее время:"Foo Bar (U) (V7.9) (США) .txt" "Few Ber Doo Ber (U) (V7.9) (США) .txt" ect

Я пытаюсь удалить раздел имени ((U) (V7.9) (США)) и заменить этот раздел на (США). Эти файлы будут называться «Foo Bar (USA) .txt», «Few Ber Doo Ber (USA) .txt».

Я не могу заставить его работать, но вот что я пытался безрезультатно:

get-childItem '* (U) (V7.9) (USA).txt' | rename-item -newname { $_.name -replace '(U) (V7.9) (USA)','(USA)' }

2 ответа2

7

Некоторые из символов, которые вы пытаетесь заменить, являются специальными символами в регулярном выражении. У них есть специальные, зарезервированные значения, которые позволяют вам создавать сложные выражения, когда они не «экранированы». Чтобы избежать их, вам просто нужно добавить обратную косую черту перед специальным персонажем. Пример:

PS C:\> $string = "(U) (V7.9) (USA)"

#Failure
PS C:\> $string -replace "(U) (V7.9) (USA)", "(USA)"
(U) (V7.9) (USA)

#Success
PS C:\> $string -replace "\(U\) \(V7\.9\) \(USA\)", "(USA)"
(USA)

Вот справочник по Powershell Regex на случай, если у вас возникнут похожие проблемы. Вы можете заметить, что вместо обратного слеша используется символ `backtick` - обратный символ является escape-символом в powershell, но это не так для всей обработки регулярных выражений в .NET (на которой построен Powershell). Из-за этого вы можете увидеть, как оба используются в примерах регулярных выражений для powershell в Интернете.

2

Если вы просто хотите удалить часть "(U) (V7.9)", вы также можете использовать:

-replace("\(U\) \(V7.9\) ","")

Но вы также должны использовать escape-символ для парантезов. И не забывайте следующий символ пробела, потому что мы не хотим получить двойной пробел.

Также есть возможность использовать метод substring(start,length) . Но там вы должны вычислить начало части "(U) (V7.9)".

$string = "Randomname (U) (V7.9) (USA).txt"
$string.substring(0, $string.length - 20) + $string.substring($string.length - 9)

который выводит Randomname (USA).txt .

20 - это число символов (начиная с конца) до первого символа строки, которую нужно удалить (в данном случае: ( of (U)). 9 - это число символов (начиная с конца) до первого символа после удаляемой строки (в данном случае: ( из (USA) , потому что мы не хотим получать пробел).

Этот метод не зависит от длины Randomname но работает только с известной позицией и длиной удаляемой строки. В любом случае, метод -replace легче использовать, если вы знаете escape-символ. Я просто хотел упомянуть другой способ получить желаемый результат.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .