Имя файла Powershell без расширения

Обновлено: 21.11.2024

При работе с именами файлов иногда приходится извлекать диск, путь или имя файла. Командлеты Get-ChildItem и Split-Path выполнят эту работу. Последний также умеет анализировать пути в реестре или в AD, если вы монтируете их как диски.

Вольфганг Зоммергут имеет более чем 20-летний опыт работы в сфере ИТ-журналистики. Он также работал системным администратором и техническим консультантом. Сегодня он руководит немецким изданием WindowsPro.de.

  • Синхронизация файлов между ПК и мобильными устройствами с помощью Synology Drive — понедельник, 14 марта 2022 г.
  • Защита RDP-соединений с помощью Remote Credential Guard – среда, 9 марта 2022 г.
  • Удаленное удаление программ с помощью PowerShell – среда, 2 марта 2022 г.

В принципе, вы можете определить нужные имена файлов с помощью Get-ChildItem, чтобы изолировать нужные части от результатов. Для имен файлов это относительно просто, потому что вы можете использовать параметр name:

Результатом является строка или массив строк соответственно, тогда как Get-ChildItem обычно возвращает объект FileInfo. Эти объекты содержат несколько полезных свойств, в том числе полное имя, включая путь (FullName), только путь (DirectoryName) и имя файла (Name ) без расширения (BaseName):

Split-Path предлагает больше возможностей ^

Если перед вами стоит задача чтения списка имен файлов для их разбора, Get-ChildItem не поможет. Split-Path закрывает этот пробел. Он может определять имена и пути к объектам файловой системы, AD или реестра, и вы можете использовать его для анализа строк, если они соответствуют синтаксису имен файлов.

Для разделения имен файлов доступны следующие параметры:

  • Определитель (диск, часть перед двоеточием соответственно)
  • NoQualifier (абсолютный путь без диска)
  • Листок (имя файла)
  • Родительский (родительский каталог как относительный или абсолютный путь)

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

Примеры ^

Split-Path не ограничивается только файловой системой; его также можно применить к реестру и AD (читай: подключить Active Directory как диск в PowerShell).

Например, если вы находитесь в AD:\DC=contoso,DC=com и введете следующую команду, вы получите все подразделения, расположенные непосредственно под доменом, как различающиеся имена:

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

На самом деле я не перебираю каталог, и в этом случае можно использовать что-то вроде свойства basename PowerShell, а имею дело только со строками.

многие ответы не учитывают вторую часть вопроса. При использовании Get-Item, Get-ChildItem или их псевдонимов ls, dir, gi, gci файл из проверяемой строки должен существовать. Когда мы проверяем серию строк, а не перебираем каталог, следует предположить, что эти файлы не обязательно должны существовать на компьютере, где будет выполняться этот скрипт.

14 ответов 14

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

Было бы неплохо, если бы рядом с каждым примером в верхнем фрагменте кода вы указывали, какой именно текст будет возвращен.

Пример, когда я не знаю имя файла .csr, но знаю, что файл существует: $csr = Get-ChildItem -Path "$($domain.FullName)/*.csr", затем Write-Host "fileName : $($csr.Базовое имя)"

@SebMa $PSCommandPath возвращает информацию о выполняющемся в данный момент скрипте, который перед выполнением должен находиться в сохраненном состоянии. Get-Item в этом случае всегда должен возвращать допустимое значение.

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

@TylerH Я не считаю, что название этого метода вводит в заблуждение. Скорее, я считаю, что это вполне согласуется с [io.path]::GetFileName. Я бы сказал, что GetFileName совершенно ясен в своем намерении, и GetFileNameWithoutExtension должен делать то же самое — без расширения.

Вдохновленный ответом @walid2mi:

Обратите внимание: это работает, только если данный файл действительно существует.

Второй пример не очень хорошо работает с чем-то вроде "C:\Downloads\ReSharperSetup.7.0.97.60.msi".split('\.')[-2]

@KeithHill в профессиональном имени файла нет точек, кроме точки в расширении, которое я собираю. Но это подлежит обсуждению.Если кто-то великодушен, можно предположить, что расширение состоит из трех символов, поэтому я бы $FileNameWoExt = $FileName.Substring(0, $FileName.Length -4)

«можно предположить, что расширение состоит из трех символов» — не очень хорошее предположение. Существует множество расширений, в которых используется более или менее трех символов, например: .psd1, .psm1, .json, .docx, .xslx, .pptx, .appx, .appbundle, .cs, .fs, .c, .h. , .py и т. д.

вы можете использовать свойство basename

Начиная с PowerShell 6, вы получаете имя файла без расширения следующим образом:

Извините :) там, где я из (Великобритания), "Болотный стандарт" — это сленговое название чего-то совершенно обычного, "ванильной" версии.

вот еще один вариант:

Расширяя ответ Рене Ниффенеггера, для тех, у кого нет доступа к PowerShell версии 6.x, мы используем разделенный путь, который не проверяет наличие файла:

Это возвращает "myfile.txt". Если мы знаем, что в имени файла нет точек, мы можем разделить строку и взять первую часть:

Это возвращает "myfile". Если имя файла может содержать точки, для безопасности мы могли бы использовать следующее:

Когда вы создаете сценарий PowerShell, вам иногда нужно создать некоторые выходные данные, например, для файла журнала. Во многих случаях имеет смысл использовать имя файла сценария для файла журнала, чтобы вы могли легко увидеть, например, из какого .ps1 был сгенерирован файл .log. Чтобы получить имя PowerShell ps1. можно использовать следующую команду из MyInvocation:

Это вернет файл ps1. файловый объект. Чтобы получить только строку имени, которую вы можете использовать:

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

Об авторе / Томасе Маурере

Похожие записи

Подкаст Betatalks — обратная связь с Azure, защита всех новых вещей и получение сертификата

Я рад сообщить вам, что я был на подкасте betatalks, чтобы рассказать о своей работе, облаке и многом другом! В этом выпуске мы поговорим .

Сертифицированный инструктор Microsoft MCT 2022-2023 — 5 лет MCT!

Я только что получил подтверждение того, что являюсь сертифицированным тренером Microsoft MCT 2022–2023. Получив статус сертифицированного тренера Microsoft в 2017 и 2019 годах, .

Веб-семинар: управление, безопасность и мониторинг Windows Server

Я рад сообщить вам, что мы планируем провести бесплатный онлайн-семинар Microsoft по управлению, безопасности и мониторингу Windows Server на .

Azure Enablement Show: введение в гибридный и многооблачный сценарий

Сегодня я могу объявить о новом выпуске Azure Enablement Show, в котором я расскажу о гибридном и многооблачном сценарии, а также о посадке .

9 ответов на вопрос «Получить имя файла сценария PowerShell внутри сценария»

Команда Get-Location возвращает путь, по которому находится оболочка. Это может не зависеть от расположения скрипта.

Поэтому, если вы хотите всегда хранить журнал в том же месте, что и сценарии, используйте один из следующих способов:
$PSScriptRoot
Split-Path -Path $MyInvocation.MyCommand.Path

Да. Я использую это в сценариях, которые генерируют отчеты по электронной почте. Удобно, чтобы иметь возможность отследить, какой скрипт был ответственен за электронное письмо.

Для завершения вашей статьи, я думаю, важно добавить, что автоматическая переменная $MyInvocation содержит информацию об инициаторе или вызывающем скрипте, а не о текущем скрипте. (Например, сценарии вложенных скриптов).

Однако $PSScriptRoot возвращает текущий корень текущего скрипта. Кроме того, $PSScriptRoot работает только для модулей PS версии 2.0. Он работает во всех скриптах Powershell версии 3.0 и выше.

Если вы запускаете свой скрипт из ISE и он не сохраняется, он не будет работать. Затем вы можете использовать $psISE.CurrentFile.FullPath, чтобы получить путь к текущей активной вкладке.

Привет,
Кто-нибудь может сказать мне, как получить PID скрипта внутри скрипта.

Нужно ли вам разделить пути, чтобы получить определенные его части? Если это так, то 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: – это диск, или квалификатор, или указанный путь. Квалификатор — это часть пути слева направо до символа двоеточия ( : ).
  • \demo\subfolder1\ – это папка и вложенные папки или контейнеры.
  • TestFile_11.txt – это имя файла или лист. Лист — это последний элемент или часть пути.

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

  • Сертификат (например, Cert:\CurrentUser\My)
  • Реестр (например, HKCU:\Software)
  • Функция (например, Function:\New-Guid)
  • Переменная (например, Переменная:\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.

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

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

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

например, Разделить -Path -Path 'c:\folder1','c:\folder2'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Строковый объект PowerShell, например путь, содержит метод split(). Этот метод позволяет разделить строку на несколько элементов на основе введенного вами символа-разделителя. А в случае путей разделителем является символ обратной косой черты ( \\ ).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выходные данные ниже показывают только файл TestFile_20.txt, так как этот файл является единственным совпадающим.

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

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

Заключение

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

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

Ненавидите рекламу? Хотите поддержать писателя? Получите многие из наших руководств в виде руководства по ATA.

Ещё от ATA Learning & Partners

Резервное копирование Office 365 для чайников

Лучшее руководство по защите данных Microsoft Office 365. Изучите готовые функции безопасности.

Руководства ATA

ATA известна своими высококачественными письменными учебными пособиями в виде сообщений в блогах. Поддержите ATA с помощью электронных книг ATA Guidebook PDF, доступных в автономном режиме и без рекламы!

Читайте также: