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

Обновлено: 07.07.2024

Описывает использование свойств объекта в PowerShell.

Подробное описание

Элемент и его объект тесно связаны между собой. При изменении объекта обычно изменяется и элемент, который он представляет. Например, при получении файла в PowerShell фактический файл не получается. Вместо этого вы получите объект FileInfo, представляющий файл. При изменении объекта FileInfo файл также изменяется.

Большинство объектов имеют свойства. Свойства —это данные, связанные с объектом. Различные типы объектов имеют разные свойства. Например, объект FileInfo, представляющий файл, имеет свойство IsReadOnly , которое содержит $true, если файл имеет атрибут только для чтения и $false в противном случае. Объект DirectoryInfo, представляющий каталог файловой системы, имеет свойство Parent, которое содержит путь к родительскому каталогу.

Свойства объекта

Выходные данные команды выводят список элементов объекта FileInfo . К элементам относятся свойства и методы. При работе в PowerShell у вас есть доступ ко всем членам этих объектов.

Чтобы получить только свойства объекта, а не методы, используйте параметр MemberType Get-Member командлета со значением Property, как показано в следующем примере.

После нахождения свойств их можно использовать в командах PowerShell.

Значения свойств

Несмотря на то, что все объекты определенного типа имеют одинаковые свойства, значения этих свойств описывают конкретный объект. Например, каждый объект FileInfo имеет свойство CreationTime, но значение этого свойства разное для каждого файла.

Как правило, для получения значений свойств объекта используется точка. Введите ссылку на объект, например переменную, содержащую этот объект, либо команду, которая его возвращает. Затем введите точку (.) и имя свойства.

Например, следующая команда отображает значение свойства CreationTime файла PowerShell.exe. Get-ChildItem Команда возвращает объект FileInfo, представляющий файл PowerShell.exe. Команду следует заключить в скобки, чтобы она выполнялась перед тем, как к свойствам получат доступ. Get-ChildItem За командой следует точка и имя свойства CreationTime, как показано ниже:

Вы также можете сохранить объект в переменной и получить его свойства, используя точку, как показано в следующем примере:

Также можно использовать Select-Object Format-List командлеты и для вывода значений свойств объекта. Select-Object``Format-List каждый из них имеет параметр Property . С помощью параметра Property можно указать одно или несколько свойств и их значений. Или можно использовать подстановочный знак (*) для представления всех свойств.

Например, следующая команда отображает значения всех свойств файла PowerShell.exe.

Статические свойства

Чтобы получить статические свойства класса, используйте параметр Static командлета Get-Member.

Например, следующая команда возвращает статические свойства System.DateTime класса.

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

Например, следующая команда возвращает значение статического свойства UtcNow System.DateTime класса.

Свойства скалярных объектов и коллекций

Свойства одного объекта (скаляр) определенного типа часто отличаются от свойств коллекции объектов одного типа. Например, у каждой службы есть свойство DisplayName , но коллекция служб не имеет свойства DisplayName .

Следующая команда возвращает значение свойства DisplayName службы "аудиосрв".

Начиная с PowerShell 3,0, PowerShell пытается предотвратить ошибки скрипта, возникающие в результате различных свойств скалярных объектов и коллекций. Та же команда возвращает значение свойства DisplayName каждой службы, которая Get-Service возвращает.

При отправке коллекции, но при запросе свойства, которое существует только для отдельных ("скалярных") объектов, PowerShell возвращает значение этого свойства для каждого объекта в коллекции.

Все коллекции имеют свойство Count , которое возвращает количество объектов в коллекции.

Начиная с PowerShell 3,0, при запросе свойства Count или length нулевых объектов или одного объекта PowerShell возвращает правильное значение.

Если свойство существует для отдельных объектов и коллекции, то возвращается только свойство коллекции.

Эта возможность также действует для методов скалярных объектов и коллекций. Дополнительные сведения см. в разделе about_Methods.

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

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

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

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

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

На основе ответа @ walid2mi:

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

Это самый простой способ получить имя файла для отдельного файла. Предполагается, что файл существует. Удаление расширения из имени файла не должно зависеть от этого. Что, если вы создаете файл на основе имени файла, в котором файл не существует? Путь - это строка, которую следует рассматривать как строку, а не как существующий файл. Второй пример не очень хорошо работает с чем-то вроде - "C: \ Downloads \ ReSharperSetup.7.0.97.60.msi" .split ('\.') [- 2]

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

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

Для любой произвольной строки пути различные статические методы объекта System.IO.Path дают следующие результаты.

Ниже приведен код, сгенерировавший вышеуказанный вывод.

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

Это правильно в PowerShell 6. В стандарте болота 5.1 нет LeafBase Спасибо за информацию, я обновил ответ соответственно. Что такое болото ? Извинения :) где я родом (Великобритания), «Bog Standard» - это жаргонный термин для чего-то совершенно обычного, «ванильной» версии.

Этот скрипт ищет в папке и подпапках и переименовывает файлы, удаляя их расширение.

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

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

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

I have a series of strings which are full paths to files. I'd like to save just the filename, without the file extension and the leading path. So from this:

I'm not actually iterating through a directory, in which case something like PowerShell's basename property could be used, but rather I'm dealing with strings alone.

157k 46 46 gold badges 373 373 silver badges 781 781 bronze badges 14.4k 36 36 gold badges 113 113 silver badges 182 182 bronze badges

14 Answers 14

179k 37 37 gold badges 322 322 silver badges 356 356 bronze badges @KeithHill thanks! -LeafBase was introduced in powershell v6 for anyone else curious

Way easier than I thought to address the issue of displaying the full path, directory, file name or file extension.


24.3k 47 47 gold badges 58 58 silver badges 89 89 bronze badges 1,271 1 1 gold badge 8 8 silver badges 3 3 bronze badges It would be nice if beside each example in the top code snippet you showed exactly what text would be returned. @Leonardo Get-Item requires that the file exists, otherwise it throws an error

Inspired by an answer of @walid2mi:

Please note: this only works if the given file really exists.

3,014 1 1 gold badge 27 27 silver badges 40 40 bronze badges @KeithHill the professional filename does not have dots other than the dot to the extension I gather. But this is to be discussed. If one is generous, one would assume an extension of three characters, so I would $FileNameWoExt = $FileName.Substring(0, $FileName.Length -4) "one would assume an extension of three characters" is not a good assumption. There are plenty of extensions that use more or less than three characters e.g.: .psd1, .psm1, .json, .docx, .xslx, .pptx, .appx, .appbundle, .cs, .fs, .c, .h, .py, etc.

you can use basename property

Starting with PowerShell 6, you get the filename without extension like so:


36.8k 27 27 gold badges 143 143 silver badges 247 247 bronze badges This is correct in powershell 6. There is no LeafBase in bog standard 5.1 Thanks for the info, I have updated the anwer accordingly. What is bog? Apologies :) where I am from (UK), "Bog Standard" is a slang term for something that is completely ordinary, a "vanilla" version.

here another option:

5,937 4 4 gold badges 33 33 silver badges 83 83 bronze badges

Expanding on René Nyffenegger's answer, for those who do not have access to PowerShell version 6.x, we use Split Path, which doesn't test for file existence:

This returns "myfile.txt". If we know that the file name doesn't have periods in it, we can split the string and take the first part:

This returns "myfile". If the file name might include periods, to be safe, we could use the following:

I need to extract file name and extension from e.g. my.file.xlsx. I don't know the name of file or extension and there may be more dots in the name, so I need to search the string from the right and when I find first dot (or last from the left), extract the part on the right side and the part on the left side from that dot.

Maybe there is better solution, but I did'n find anything here or anywhere else. Thank you

4,978 14 14 gold badges 50 50 silver badges 64 64 bronze badges

10 Answers 10

If the file is coming off the disk and as others have stated, use the BaseName and Extension properties:

If you are given the file name as part of string (say coming from a text file), I would use the GetFileNameWithoutExtension and GetExtension static methods from the System.IO.Path class:

22.5k 14 14 gold badges 82 82 silver badges 127 127 bronze badges For more useful methods in the System.IO.Path class without referring to MSDN documentation, you can use [System.IO.Path] | Get-Member -Static Note that [System.IO.Path]::GetExtension returns the extension including the period ("."). 4,923 4 4 gold badges 31 31 silver badges 30 30 bronze badges

If is from a text file and and presuming name file are surrounded by white spaces this is a way:

If is a file you can use something like this based on your needs:


54.8k 8 8 gold badges 144 144 silver badges 149 149 bronze badges Note that this will only work if there is no periods in the filename. you can change to Split(".")[-1] to make it work with files with dots in the name


14.3k 3 3 gold badges 33 33 silver badges 40 40 bronze badges


Check the BaseName and Extension properties of the FileInfo object.

111k 27 27 gold badges 172 172 silver badges 193 193 bronze badges

As of PowerShell 6.0, Split-Path has an -Extenstion parameter. This means you can do:

For $path = "test.txt" both versions will return .txt , inluding the full stop.

This is an adaptation, if anyone is curious. I needed to test whether RoboCopy successfully copied one file to multiple servers for its integrity:

Nice and simple, and it shows the directory and the file inside it. If you want to specify one file name or extension, just replace the *'s with whatever you want.


if [System.IO.Path]::GetFileNameWithoutExtension() is hard to type or remember:

-split takes a regex (by default) so the . has to be escaped

I don't think there's a "locale" name.ext filename separator, is there?

-SkipLast was added in v5.0

having to -rejoin the string after splitting could change the result, I suppose, in unusual circumstances. Or if you're uncomfortable re-joining a string that's already joined, one could:

Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. В этой статье описывается выполнение конкретных задач по управлению файлами и папками с помощью PowerShell.

Получение списка файлов и папок, содержащихся в папке

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem . Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse . (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object .

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Копирование файлов и папок

Копирование выполняется с помощью командлета Copy-Item . Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:

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

Эта команда работает, даже если целевой объект доступен только для чтения.

Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке C:\data , в папку C:\temp\text :

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:\boot.ini в файле C:\boot.bak :

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку C:\temp\New Folder :

Эта команда создает пустой файл C:\temp\New Folder\file.txt .

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета Remove-Item , однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки C:\temp\DeleteMe , которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

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

Подключение локальной папки как диска

Отобразить локальную папку можно с помощью команды New-PSDrive . Следующая команда создает локальный диск P: , корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:

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

Чтение текстового файла в массив

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

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле C:\temp\domainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Вы можете использовать командлет Get-Content , чтобы извлечь содержимое файла и поместить его в переменную $Computers :

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.

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