Как разделить пути с помощью командлета PowerShell Split-Path

Вам нужно разделить пути, чтобы получить конкретные их части? Если да, то PowerShell Split-Path – это тот друг, на которого вы можете положиться. Когда вы работаете с файлами, сертификатами и реестром, вы заметите, что пути представляют их местоположения.

И в какой-то момент вам может потребоваться отфильтровать, какую часть пути вернуть, возможно, при автоматизации. К счастью для вас, этот учебник научит вас способам использования командлета PowerShell Split-Path для этого.

Давайте! Продолжайте читать, и давайте добавим в ваш арсенал PowerShell новое оружие!

Предварительные требования

Если вы планируете следовать примерам в этом практическом учебнике, вам понадобится компьютер с любой современной версией Windows, на котором установлен PowerShell 5.1 или выше. В этом учебнике будет использоваться Windows 10 20H2 с PowerShell 7.1.1.

Что такое путь?

Прежде чем углубляться в работу с командлетом PowerShell Split-Path, давайте убедимся, что вы понимаете, что такое путь. Путь определяет местоположение элемента, который следует определенному формату.

Например, путь к файлу может быть C:\demo\subfolder1\TestFile_11.txt. Если разделить этот путь на части, путь включает следующее:

  • C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (:) character.
  • \demo\subfolder1\ – это папка и подпапка(и) или контейнеры.
  • TestFile_11.txt – это имя файла или лист. Лист – это последний элемент или часть пути.

Помните, что пути не ограничиваются только файлами и папками. Другие допустимые пути могут включать:

  • Сертификат (например, Cert:\CurrentUser\My)
  • Реестр (например, HKCU:\Software)
  • Функция (например, Function:\New-Guid)
  • Переменная (например, Variable:\PSEdition)
  • Active Directory (например, AD:\CN=Users,DC=Constoso,DC=com)

Параметры разделения пути PowerShell

Как и любая команда, Split-Path поставляется с набором параметров, которые управляют тем, как команда ведет себя и возвращает свой вывод. Именно эти параметры составляют синтаксис PowerShell Split-Path.

  • -Path – Этот параметр принимает одну или несколько строк пути, которые вы хотите разделить. Этот параметр также принимает ввод через конвейер. Шаблоны в путях также допустимы.
  • -LiteralPath – Как и параметр -Path, параметр -LiteralPath также принимает пути для разделения. Но этот параметр будет рассматривать путь только так, как он написан. Это означает, что команда не будет интерпретировать шаблоны, если вы используете этот параметр для указания путей.
  • -Resolve – Этот параметр указывает команде Split-Path разрешить файлы или элементы, на которые ссылается указанный вами путь. Из-за его буквальной природы вы не можете использовать этот параметр вместе с параметром -LiteralPath.
  • -IsAbsolute – Этот параметр возвращает логическое значение, чтобы определить, является ли указанный вами путь абсолютным или нет.

Команда PowerShell Split-Path также имеет параметр, называемый -Credential, который, предположительно, принимает объект учетных данных PSCredential. Но согласно информации от Microsoft, этот параметр не поддерживается ни одним из предустановленных провайдеров PowerShell и вызывает ошибку при его использовании.

Следующие параметры называются Параметрами местоположения разделения. Эти параметры сообщают команде PowerShell Split-Path, какой элемент или часть пути возвращать. Поскольку команда может возвращать только один элемент пути, вы можете использовать только один из этих параметров за раз.

  • -Parent – Возвращает родительское местоположение (без элемента или имени файла) указанного вами пути. Этот параметр также является параметром местоположения разделения по умолчанию, что означает, что вы можете опустить этот параметр и все равно получить родительское местоположение в качестве результата.
  • -Leaf – Возвращает только последний элемент пути или лист.
  • -LeafBase – Возвращает только последний элемент пути или лист без расширения. Этот параметр доступен только в PowerShell 6.0 и выше.
  • -Extension – Возвращает только расширение файла (от последней точки “.” до последнего символа пути). Этот параметр доступен только в PowerShell 6.0 и выше.
  • -Qualifier – Возвращает только диск или квалификатор пути.
  • -NoQualifier – Удаляет диск или квалификатор из остальной части пути.

Использование командлета PowerShell Split-Path (Примеры)

Командлет PowerShell Split-Path позволяет разбивать и разбирать части пути. После этого вы можете указать, какую часть пути вернуть. В зависимости от требований к выводу вы можете выбрать, вернуть ли квалификатор, путь без квалификатора и/или имя(ена) файла(ов).

Получение родительской папки пути

Чтобы вернуть родительскую папку пути, выполните командлет PowerShell Split-Path и добавьте параметр -Parent.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

Результат ниже показывает, что команда возвращает путь к родительской папке.

Returning the parent containers of the Item

Совет: Запуск командлета PowerShell Split-Path без параметров по умолчанию вернет родительскую папку, то же самое поведение, что и при использовании параметра -Parent.

Совет: Параметр -Path принимает несколько путей, что позволяет разбивать несколько строк значений путей в одной команде.

e.g., Split-Path -Path 'c:\folder1','c:\folder2'

Отображение пути без квалификатора

Представьте, что вы создаёте скрипт, который дублирует структуру дерева каталогов с одного диска на другой (например, C:\demo\subfolder1 на D:\demo\subfolder1). Вам может понадобиться, чтобы ваш код разбивал исходный путь и получал только структуру папок без буквы диска.

Чтобы получить путь без квалификатора, выполните команду PowerShell Split-Path с параметром -NoQualifier, как показано ниже. Эта команда разбивает путь, исключая при этом букву диска из результата.

Split-Path -Path C:\demo\subfolder1 -NoQualifier

Как видно из результата ниже, использование параметра noQualifier возвращает путь, но без строки квалификатора.

Returning the Path Without the Qualifier

Получение диска или квалификатора пути

Иногда вам может понадобиться вернуть только квалификатор или букву диска. Например, когда вы хотите, чтобы ваш скрипт подводил итоги на основе букв дисков.

Для этого выполните команду PowerShell Split-Path с параметром -Qualifier, как показано ниже. Эта команда разобьет путь и вернет только строку квалификатора в результате.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

Отображение имени файла, каталога или элемента

Представьте путь как дерево. Квалификатор – это само дерево, папки – это ветви, а в конце вы найдете лист. Листом является любая ненулевая строка в конце пути.

Когда вам нужно разбить путь, чтобы получить лист, выполните команду Split-Path ниже и добавьте параметр -Leaf.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

Как результат, на изображении ниже показано, что команда вернула только имя файла из указанного вами пути.

Returning the Path’s Leaf

Разделение имени файла и расширения (≥PowerShell 6.0)

Примечание: Этот раздел применим к PowerShell 6.0 и выше.

Таким образом, вы разделили путь и получили элемент. В данном случае элементом является имя файла (TestFile_11.txt), которое состоит из двух частей – базовой и расширения. Команда Split-Path в PowerShell позволяет вам дополнительно разделить лист на эти две части с использованием параметров -LeafBase и -Extension.

Чтобы получить базовое имя и расширение файла, выполните следующие команды.

Если путь не содержит расширения, параметр Extension вернет пустую строку.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and Extension

Разделение имени файла и расширения (≤ Windows PowerShell 5.1)

К сожалению, параметры -LeafBase и -Extension не доступны в Windows PowerShell 5.1 и более ранних версиях. Но не волнуйтесь, с помощью некоторой магии PowerShell, вы можете воспроизвести вывод этих параметров даже если у вас только Windows PowerShell 5.1.

Но вместо командлета Split-Path, вы будете использовать следующее лучшее – комбинацию метода split() и оператора -replace.

A PowerShell string object, such as the path, contains a split() method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\) back-slash character.

С другой стороны, оператор -replace позволяет заменять строки с использованием регулярных выражений (RegEx).

Для имитации результатов параметра -LeafBase выполните следующую команду в PowerShell.

# Разделите путь ('C:\demo\subfolder1\TestFile_11.txt'), используя '\' в качестве разделителя.
# Выберите последний элемент '[-1]' после разделения (TestFile_11.txt)
# Поиск строки, соответствующей этому шаблону --> '\.[^.]*$'
# ^ этот шаблон будет соответствовать последней точке "." в пути И каждому другому символу после нее.
# Затем замените найденное совпадение на пустое значение ''.
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

В результате, на скриншоте ниже показано, что команда вернула только базовое имя файла.

Getting the file base in PowerShell 5.1

Теперь, чтобы получить только расширение файла, выполните следующую команду в PowerShell.

# Разделите путь ('C:\demo\subfolder1\TestFile_11.txt'), используя '.' в качестве разделителя.
# Выберите последний элемент '[-1]' после разделения (txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

Результат ниже показывает, что команда вернула только расширение файла – txt.

Getting the file extension in PowerShell ≤ 5.1

Определение, является ли путь абсолютным

Как системный администратор, вы столкнетесь с двумя типами путей—абсолютный и относительный. Но в чем разница? Абсолютный путь начинается с квалификатора, такого как C:\demo или HKCU:\Software. В отличие от этого, относительный путь не имеет квалификатора, как .\demo или \folder1\folder2.

PowerShell Split-Path cmdlet может помочь вам определить абсолютный путь, используя параметр -IsAbsolute. Для этого выполните команды ниже, чтобы определить, является ли путь абсолютным.

# Этот путь абсолютный
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# Этот путь относительный
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

Как видно ниже, параметр -isAbsolute возвращает булево значение, указывающее, является ли путь абсолютным (TRUE) или относительным (FALSE).

Determining if the Path is Absolute

Разделение и разрешение путей с использованием подстановочных символов

До этого момента разбиваемые с помощью Split-Path пути не обязательно должны существовать. Независимо от того, существует ли путь или нет, этот cmdlet разобьет его и предоставит вам результат.

Однако у cmdlet Split-Path есть еще один параметр, называемый -Resolve. Этот параметр позволяет разрешить элементы, на которые ссылаются подстановочные символы. И если вы будете использовать этот параметр, путь, который вы разделите, и элементы внутри него, должны уже существовать.

Например, чтобы вернуть элементы, соответствующие расширению файла *.txt, выполните команду ниже. Параметр -Leaf гарантирует, что cmdlet возвращает только элементы, а не родительские контейнеры.

Подстановочный символ (*) представляет собой один или несколько символов для сопоставления, а (?) представляет собой подстановочный символ для одного символа.

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

Результат ниже перечисляет файлы TestFile_11.txt по TestFile_20.txt. Все эти файлы соответствуют расширению файла .txt.

Resolving matching filenames

Для разрешения совпадения одного символа замените звездочку (*) на знак вопроса (?), как показано в следующей команде.

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

Ниже показан результат только для файла TestFile_20.txt, потому что этот файл единственный, который соответствует условиям.

Resolving matching single character

Если путь содержит символ экранирования, такой как обратная кавычка (“`), заключите путь в одинарные кавычки для его разрешения. Например, команда ниже разбивает и разрешает путь, содержащий символ экранирования.

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

В качестве доказательства концепции, если вы не заключите этот путь в одинарные кавычки, команда вернет ошибку о том, что путь не существует. Та же ошибка произойдет, если вместо этого использовать двойные кавычки.

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

Заключение

Командлет PowerShell Split-Path является незаменимым инструментом для системных администраторов и пользователей. Этот учебник призван научить вас, как командлет Split-Path может разделять любой заданный путь и возвращать конкретные элементы в зависимости от используемого параметра.

Вы использовали Split-Path в своих задачах раньше? Если нет, убедил ли вас этот учебник использовать его в ваших ручных или автоматизированных задачах? Или у вас есть другой способ разделения путей, лучший, чем PowerShell Split-Path?

Source:
https://adamtheautomator.com/powershell-split-path/