Как мне удалить часть имени файла? - PullRequest
1 голос
/ 14 марта 2019

Предположим, у меня есть файл database_partial.xml.

Я пытаюсь удалить файл из "_partial", а также из расширения (xml), а затем использовать заглавную букву в имени, чтобы оно стало DATABASE.

Param($xmlfile)

$xml = Get-ChildItem "C:\Files" -Filter "$xmlfile"

$db = [IO.Path]::GetFileNameWithoutExtension($xml).ToUpper()

Это возвращает DATABASE_PARTIAL, но я не знаю, как удалить часть _PARTIAL.

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Вам не нужно GetFileNameWithoutExtension() для удаления расширения.FileInfo объекты, возвращаемые Get-ChildItem, имеют свойство BaseName, которое дает вам имя файла без расширения.Заглавные буквы, затем удалите суффикс "_PARTIAL".Я также рекомендовал бы обрабатывать вывод Get-ChildItem в цикле, на случай, если он не вернет ровно один результат.

Get-ChildItem "C:\Files" -Filter "$xmlfile" | ForEach-Object {
    $_.BaseName.ToUpper().Replace('_PARTIAL', '')
}

Если подстрока после подчеркивания может изменяться, используйте замену регулярного выражениявместо замены строки, например, так:

Get-ChildItem "C:\Files" -Filter "$xmlfile" | ForEach-Object {
    $_.BaseName.ToUpper() -replace '_[^_]*$'
}
1 голос
/ 14 марта 2019

Полезный ответ Ансгара Вичерса дает эффективное решение.

Чтобы сосредоточиться на более общем вопросе , как удалить (удалить) часть имени файла (строки) :

Используйте оператор 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 получит массив обрезанного базовые имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...