Полезный ответ Ансгара Вичерса дает эффективное решение.
Чтобы сосредоточиться на более общем вопросе , как удалить (удалить) часть имени файла (строки) :
Используйте оператор PowerShell -replace
, синтаксис которого:
<stringOrStrings> -replace <regex>, <replacement>
:
<regex>
- это регулярное выражение ( регулярное выражение ), которое соответствует заменяемой части,
<replacement>
- это операнд-заменитель (строка, заменяющая совпадение с регулярным выражением).
- Для эффективного удаления того, что сопоставлено регулярному выражению, укажите
''
(пустая строка) или просто опустите операнд в целом - в любом случае совпавшая часть эффективно удалено из входной строки.
Для получения дополнительной информации о -replace
см. этот ответ .
Применительно к вашему делу:
$db = 'DATABASE_PARTIAL' # sample input value
PS> $db -replace '_PARTIAL$', '' # removes suffix '_PARTIAL' from the end (^)
DATABASE
PS> $db -replace '_PARTIAL$' # ditto, with '' implied as the replacement string.
DATABASE
Примечание:
-replace
по умолчанию не учитывает регистр , как и все операторы PowerShell. Чтобы явно выполнить регистр с учетом , используйте вариант -creplace
.
В отличие от этого, метод [string]
типа .Replace()
(например, $db.Replace('_PARTIAL', '')
:
- соответствует только строковым литералам и, следовательно, предлагает меньшую гибкость; в этом случае вы не можете оговорить, что
_PARTIAL
должно совпадать только на конце строки, например.
- является неизменно регистр чувствителен в .NET Framework (хотя .NET Core предлагает нечувствительную к регистру перегрузку).
Исходя из ответа Ансгара, ваш сценарий может быть оптимизирован следующим образом:
Param($xmlfile)
$db = ((Get-ChildItem C:\Files -Filter $xmlfile).BaseName -replace '_PARTIAL$').ToUpper()
Обратите внимание, что в PSv3 + это работает, даже если $xmlfile
должно соответствовать нескольким файлам, из-за перечисления членов и способности -replace
принимать массив строк в качестве входных данных, желаемое удаление подстроки будет выполнено для базовых имен всех файлов, как и последующий верхний регистр - $db
получит массив обрезанного базовые имена.