Powershell вывести файлы с расширением
Поставщик файловой системы PowerShell позволяет получать, добавлять, изменять, очищать и удалять файлы и каталоги в PowerShell.
Диски файловой системы — это иерархическое пространство имен, содержащее каталоги и файлы на компьютере. Диск файловой системы может быть логическим или физическим диском, каталогом или сопоставленным сетевым ресурсом.
Поставщик FileSystem поддерживает следующие командлеты, описанные в этой статье.
Получение данных
Для открытия файла 'C:\text.txt' можно использовать следующую команду:
Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:
- '*' - говорит об неизвестном количестве символов;
- [a,b] - говорит, что в этом месте может быть буква 'a' или 'b';
- ? - обозначает один неизвестный символ.
Каждый из символов выше можно применять вместе и неограниченное число раз, в любой части пути и имени.
В этом примере я открою сразу два файла: lmhosts и hosts:
Следующие примеры вернут аналогичный результат:
Для похожей фильтрации есть следующие параметры, которые так же позволяют использовать символы подстановок:
- Include - в этом параметре мы добавляем шаблон, по которому будем включать файл;
- Exclude - с помощью этого параметра исключает файлы;
- Filter - исключает результаты.
Для каждого из этих параметров есть обязательно условие - использовать знак '*' в конце пути.
Так мы вернем все файлы с расширением '.txt':
В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата '.txt' и '.ini':
Переименование файлов и каталогов
Ограничение вывода строк
Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:
- Head - выведет указанное количество строк с начала;
- Tail - выведет указанное количество строк с конца.
Так будут выведены только первые 5 строк:
Создание и изменение в Powershell NTFS разрешений ACL
Типы, предоставляемые этим поставщиком
Файлы являются экземплярами класса System. IO. FileInfo . Каталоги являются экземплярами класса System. IO. DirectoryInfo .
Если нужна только цифра, а не объект, можно сделать так:
Полное и построчное чтение с поиском
По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:
Непрерывное чтение
С помощью параметра Wait вы можете читать файл, который в этот момент обновляется системой или другим пользователем:
Получение скрытых файлов
Эта команда возвращает все файлы, включая скрытые файлы, в текущем каталоге.
В нем используется параметр Attributes с двумя значениями, !Directory+Hidden , который получает скрытые файлы, и !Directory , который получает все остальные файлы.
dir -att !d,!d+h эквивалентна этой команде.
Переименуйте файл
Эта команда переименовывает a.txt файл в C:\a каталоге b.txt следующим образом:
Использование конвейера
Командлеты поставщика принимают входные данные конвейера. Вы можете использовать конвейер для упрощения задачи, отправив данные поставщика из одного командлета другому командлету поставщика. Дополнительные сведения об использовании конвейера с командлетами поставщика см. в справочнике по командлетам, приведенным в этой статье.
Разделение файла
Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен '\n' (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:
То есть результат выше - это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:
Копирование файлов и каталогов
Copy-Item Командлет копирует файлы и каталоги в указанное расположение. Параметры можно использовать для фильтрации и рекурсии, аналогично Get-ChildItem .
следующая команда копирует все файлы и каталоги по пути "C:\temp " в папку" C:\ Windows \temp ".
Copy-Item перезаписывает файлы в целевом каталоге без запроса подтверждения.
Эта команда копирует a.txt файл из C:\a каталога в C:\a\bb каталог.
Копирует все каталоги и файлы из C:\a каталога C:\c в каталог. Если какие-либо копируемые каталоги уже существуют в целевом каталоге, то команда завершится с ошибкой, если не указан параметр Force.
Дополнительные сведения см. в разделе Copy-Item.
Получение сжатых и зашифрованных файлов
Эта команда возвращает файлы в текущем каталоге, которые сжаты или зашифрованы.
Он использует -Attributes параметр с двумя значениями Compressed и Encrypted . Значения разделяются запятой , , которая представляет оператор "или".
Создание файла с содержимым
Создает файл с именем log2.txt в C:\logfiles каталоге и добавляет в файл строку "тестовый журнал".
Навигация по дискам файловой системы
Поставщик FileSystem предоставляет свои хранилища данных путем сопоставления логических дисков на компьютере с дисками PowerShell. Для работы с диском файловой системы можно изменить расположение на диск, используя имя диска, за которым следует двоеточие ( : ).
Вы также можете работать с поставщиком FileSystem с любого другого диска PowerShell. Чтобы сослаться на файл или каталог из другого расположения, используйте имя диска ( C: , D: . ) в пути.
PowerShell использует Псевдонимы для предоставления привычного способа работы с путями поставщика. Команды, такие как dir и ls , теперь являются псевдонимами для Get-ChildItem, cd являются псевдонимом для Set-Location. и pwd — это псевдоним для Get-Location.
Динамические параметры
Динамические параметры — это параметры командлета, которые добавляются поставщиком PowerShell и доступны только при использовании командлета на диске с поддержкой поставщика.
EncodingУказывает кодировку файла. Значение по умолчанию — ASCII.
- ASCII: использует кодировку для набора символов ASCII (7-разрядных).
- BigEndianUnicode: кодирует в формате UTF-16 с обратным порядком байтов.
- Строка: использует тип кодировки для строки.
- Юникод: кодирует в формате UTF-16 с прямым порядком байтов.
- UTF7: кодирует в формате UTF-7.
- UTF8: кодирует в формате UTF-8.
- UTF8BOM: кодирует в формате UTF-8 с меткой порядка БАЙТОВ (BOM)
- UF8NOBOM: кодирует в формате UTF-8 без метки порядка БАЙТОВ (BOM)
- UTF32: кодирует в формате UTF-32.
- По умолчанию: кодируется на странице установленного по умолчанию кода.
- OEM: использует кодировку по умолчанию для программ MS-DOS и консолей.
- Неизвестно: неизвестный или недопустимый тип кодировки. Данные можно обрабатывать как двоичные.
Поддерживаемые командлеты
DelimiterУказывает разделитель, используемый командлетом Get-Content для разделения файла на объекты при чтении.
Значение по умолчанию — \n , символ конца строки.
При чтении текстового файла командлет Get-Content Возвращает коллекцию строковых объектов, каждая из которых заканчивается символом-разделителем.
При вводе разделителя, который не существует в файле, командлет Get-Content возвращает весь файл как один объект без разделителей.
Этот параметр можно использовать для разбиения большого файла на меньшие файлы, указав разделитель файла, например "Конец примера", в качестве разделителя. Разделитель сохраняется (не удаляется) и становится последним элементом в каждом разделе файла.
В настоящее время, если значение -Delimiter параметра является пустой строкой, командлет Get-Content не возвращает ничего. Это известная проблема. Чтобы принудительно применить командлет Get-Content для возврата всего файла в виде единой неразделенной строки, введите значение, которое не существует в файле.
Поддерживаемые командлеты
Ожидает содержимое для добавления в файл. Если содержимое добавлено, возвращает добавленное содержимое. Если содержимое не изменилось, возвращает весь файл.
Во время ожидания командлет Get-Content проверяет файл раз в секунду, пока не будет прерван, например, нажатием сочетания клавиш CTRL+C.
Поддерживаемые командлеты
AttributesИзвлекает файлы и папки с указанными атрибутами. Этот параметр поддерживает все атрибуты и позволяет указывать сложные сочетания атрибутов.
-Attributes параметр был введен в Windows PowerShell 3,0.
-Attributes Параметр поддерживает следующие атрибуты:
Описание этих атрибутов см. в описании перечисления FileAttributes .
Используйте следующие операторы для объединения атрибутов.
Пробелы между оператором и его атрибутами не допускаются. Однако допустима постановка пробелов перед запятыми.
Поддерживаемые командлеты
DirectoryИзвлекает каталоги (папки).
-Directory параметр был введен в Windows PowerShell 3,0.
Чтобы получить только каталоги, используйте -Directory параметр и опустите -File параметр. Чтобы исключить каталоги, используйте -File параметр и опустите -Directory параметр, либо используйте -Attributes параметр.
Поддерживаемые командлеты
-File параметр был введен в Windows PowerShell 3,0.
Чтобы получить только файлы, используйте -File параметр и опустите -Directory параметр. Чтобы исключить файлы, используйте -Directory параметр и опустите -File параметр, либо используйте -Attributes параметр.
Поддерживаемые командлеты
HiddenВозвращает только скрытые файлы или каталоги (папки). По умолчанию командлет Get-ChildItem получает только нескрытые элементы.
-Hidden параметр был введен в Windows PowerShell 3,0.
Чтобы получить только скрытые элементы, используйте -Hidden параметр, его h псевдонимы или ah скрытое значение -Attributes параметра. Чтобы исключить скрытые элементы, опустите -Hidden параметр или используйте -Attributes параметр.
Поддерживаемые командлеты
ReadOnlyИзвлекает только файлы или каталоги (папки), доступные для чтения.
-ReadOnly параметр был введен в Windows PowerShell 3,0.
Чтобы получить только элементы, доступные только для чтения, используйте -ReadOnly параметр, его ar псевдоним или значение -Attributes ReadOnly параметра. Чтобы исключить элементы, предназначенные только для чтения, используйте -Attributes параметр.
Поддерживаемые командлеты
SystemИзвлекает только системные файлы или каталоги (папки).
-System параметр был введен в Windows PowerShell 3,0.
Чтобы получить только системные файлы и папки, используйте -System параметр, его as псевдоним или системное значение -Attributes параметра. Чтобы исключить системные файлы и папки, используйте -Attributes параметр.
Поддерживаемые командлеты
NewerThanВозвращает $True , если LastWriteTime значение файла больше указанной даты. В противном случае она возвращает $False .
Введите объект DateTime , например, возвращаемый командлетом Get-Date , или строку, которую можно преобразовать в объект DateTime , например "August 10, 2011 2:00 PM" .
Поддерживаемые командлеты
OlderThanВозвращает $True , если LastWriteTime значение файла меньше указанной даты. В противном случае она возвращает $False .
Введите объект DateTime , например, возвращаемый командлетом Get-Date , или строку, которую можно преобразовать в объект DateTime , например "August 10, 2011 2:00 PM" .
Поддерживаемые командлеты
StreamУправляет альтернативными потоками данных. Введите имя потока. Подстановочные знаки разрешены только в командах Get-Item для и Remove-Item на диске файловой системы.
Поддерживаемые командлеты
Игнорирует символы новой строки. Возвращает содержимое в виде одного элемента.
Поддерживаемые командлеты
ItemTypeЭтот параметр позволяет указать те элемента для создания New-Item
Доступные значения этого параметра зависят от текущего используемого поставщика.
FileSystem В диске допустимы следующие значения:
- Файл
- Каталог
- SymbolicLink
- Соединение
- HardLink
Подсчет четных чисел в файле
У меня есть файл 'file.txt' со следующим содержанием:
Шаблон регулярного выражения '\d*\.?\d*' говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой.
Для выделения таких чисел из строк нужно использовать Select-String:
Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:
Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:
Powershell Get-Member - это команда, которая возвращает все свойства и методы объекта. На мой взгляд, после понимания этого командлета, становится намного проще работать с PS.
Get-Member ничего не изменяет, он только показывает что содержится в объекте. Каждый результат каких-то действий формирует объект и для того что бы увидеть из чего он состоит нужно выполнить:
У каждого объекта в powershell есть метод GetType, который выводит тип данных (строка, число, дата и т.д.). В нашем случае очевидно, что это строка, но порой это бывает не ясно и можно это узнать подобным образом:
Свойства на английском Property, а методы Method и порой их бывает очень много, а нам нужно узнать только о конкретном типе. Что бы вывести все свойства выполните следующее:
В нашем случае мы видим только один Property, но чаще их бывает больше. Length выводит в powershell длину строки. Вызывается аналогично:
Удаление файлов с помощью подстановочных знаков
Эта команда удаляет все файлы в текущем каталоге с .xml расширением имени файла:
Подсчет количества строк
Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:
Управление дескрипторами безопасности
Получение файлов и папок с указанными атрибутами
Создание файлов и каталогов
Просмотр списка ACL для файла
Чтобы получить дополнительные сведения об этом объекте, передайте команду в командлет Get-Member по конвейеру. Или см. раздел класс FileSecurity .
Изменение файла с последующей записью
Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес '127.0.0.1' в строке - это можно сделать так:
Или с помощью регулярного выражения (не точный шаблон):
Для записи в файл у нас есть два варианта. Первый - это использовать перенаправление в виде знака '>', который перезапишет все содержимое файла или создаст новый файл:
Второй вариант - использовать команду Set-Content:
Функции по работе со строками в Powershell
Изменение ACL для файла
Запуск программы путем вызова связанного файла
Получение файлов и каталогов
Get-ChildItem Командлет возвращает все файлы и каталоги в текущем расположении. Можно указать другой путь для поиска и использовать встроенные параметры для фильтрации и управления глубиной рекурсии.
Дополнительные сведения об использовании командлетов см. в статье Get-ChildItem.
Замена содержимого файла
Эта команда заменяет содержимое Test.txt файла строкой "Test Content":
Он перезаписывает содержимое Test.txt . Можно использовать параметр value командлета New-Item , чтобы добавить содержимое в файл при его создании.
Управление содержимым файлов
Удаление файла
Эта команда удаляет Test.txt файл в текущем каталоге:
Удаление файлов и каталогов
14 Answers 14
Way easier than I thought to address the issue of displaying the full path, directory, file name or file extension.
It would be nice if beside each example in the top code snippet you showed exactly what text would be returned.
Example where I don't know the .csr file name, but I know a file exists: $csr = Get-ChildItem -Path "$($domain.FullName)/*.csr" then Write-Host "fileName: $($csr.Basename)"
@SebMa $PSCommandPath returns information of the currently running script, which should be in a saved state before execution. Get-Item in this case should always return a valid value.
This method name is misleading. it seems to get the file name without the extension or the file path. That's useful if it's what you want, but a deal-breaker if you only want to remove the extension. which someone finding this method would be led to believe.
@TylerH I don't find this method name misleading. Rather, I find it to be quite consistent with [io.path]::GetFileName. I would say that GetFileName is quite clear in its intent and GetFileNameWithoutExtension should do the same thing--without the extension.
Inspired by an answer of @walid2mi:
Please note: this only works if the given file really exists.
The second example doesn't work too well with something like - "C:\Downloads\ReSharperSetup.7.0.97.60.msi".split('\.')[-2]
@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:
Apologies :) where I am from (UK), "Bog Standard" is a slang term for something that is completely ordinary, a "vanilla" version.
here another option:
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:
This returns "myfile.txt.config". Here I prefer to use Substring() instead of Replace() because the extension preceded by a period could also be part of the name, as in my example. By using Substring we return the filename without the extension as requested.
Переименование каталога
Эта команда переименовывает C:\a\cc каталог в C:\a\dd :
Поддерживаемые командлеты
Вызов файла
Первая команда использует командлет Get-Service для получения сведений о локальных службах.
Он передает сведения в командлет Export-CSV , а затем сохраняет эти сведения в Services.csv файле.
Вторая команда использует Invoke-Item для открытия services.csv файла в программе, связанной с .csv расширением:
Чтения файла под другим пользователем
В этом командлете не предусмотрена возможность открытия файла под другим пользователем. При любых попытках вы будете получать ошибки:
- Access to the path is denied
- The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.
Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.
Сам процесс открытия файла под другим пользователем будет выглядеть так:
Создание каталога
Эта команда создает logfiles каталог на C диске:
PowerShell также включает mkdir функцию (псевдоним md ), которая использует командлет New-Item для создания нового каталога.
Кодировки
В параметре -Encoding можно указать следующие кодировки:
- ASCII
- BigEndianUnicode
- BigEndianUTF32
- Byte
- Default
- OEM
- Unicode
- UTF7
- UTF8
- UTF32
Как искать файлы используя Powershell Get-ChildItem
Получение справки
Начиная с Windows PowerShell 3.0, стали доступны настраиваемые разделы справки по командлетам поставщика, в которых объясняется поведение этих командлетов на диске файловой системы.
Чтобы получить разделы справки, настроенные для диска файловой системы, выполните команду Get-Help на диске файловой системы или используйте -Path параметр командлета Get-Help , чтобы указать диск файловой системы.
Для открытия файлов и чтения его содержимого используется команда Powershell Get-Content. В этой статье рассмотрим работу команды с открытием файла, построчным чтением, поиском по содержимому строки на примерах.
Навигация по посту
Что бы текст передавался полностью, а не построчно - используйте параметр Raw:
Если вам вдруг понадобится выводить по 2 или более строк за раз, можно указать их количество через ReadCount:
Перебрать содержимое файла
По умолчанию Get-Content командлет использует символ конца строки в качестве разделителя, поэтому он получает файл в виде коллекции строк, каждая из которых имеет одну строку в файле.
С помощью -Delimiter параметра можно указать альтернативный разделитель. Если в качестве его значения будут заданы символы, обозначающие конец раздела или начало следующего раздела, файл можно будет разделить на логические части.
Первая команда получает Employees.txt файл и разделяет его на разделы, каждый из которых заканчивается словами "конец записи о сотруднике", и сохраняет его в $e переменной.
Вторая команда использует нотацию массива для получения первого элемента в коллекции в $e . Он использует индекс 0, так как массивы PowerShell отсчитываются от нуля.
Дополнительные сведения о Get-Content командлете см. в разделе справки по разделу Get-Content.
Дополнительные сведения о массивах см. в разделе about_Arrays.
Перемещение файлов и каталогов
Эта команда перемещает c.txt файл в C:\a каталог C:\a\aa в каталог:
Команда не перезапишет автоматически существующий файл с тем же именем. Для принудительной перезаписи существующего файла необходимо задать параметр Force.
Нельзя перемещать каталог, если он совпадает с текущим местоположением. При использовании Move-Item для перемещения каталога в текущем расположении отображается эта ошибка.
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:
For more useful methods in the System.IO.Path class without referring to MSDN documentation, you can use [System.IO.Path] | Get-Member -Static
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:
Check the BaseName and Extension properties of the FileInfo object.
Any particular infoyou're after? Just pipe a file to Get-Member to reveal all of it;s members or browse to MSDN to find the official help.
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:
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.
many answers are not taking in account second part of the question. When Get-Item, Get-ChildItem, or their aliases ls, dir, gi, gci are used, the file from the tested string must exist. When we are checking a series of string and not iterating through a directory, it must be assumed those files doesn't need to exist on computer where this script will be run.
Получение системных файлов
Эта команда возвращает системные файлы в текущем каталоге и его подкаталогах.
Он использует -File параметр для получения только файлов (не каталогов) и -System параметр для получения только элементов с атрибутом System.
Он использует -Recurse параметр для получения элементов в текущем каталоге и всех подкаталогах.
Получение содержимого файла
Эта команда возвращает содержимое файла "Test.txt" и отображает их в консоли.
Содержимое файла можно передать другому командлету по конвейеру. Например, следующая команда считывает содержимое Test.txt файла и затем передает его в качестве входных данных командлету ConvertTo-HTML :
Можно также получить содержимое файла, указав в качестве пути к нему знак доллара ( $ ). Путь должен быть заключен в фигурные скобки из-за ограничений именования переменных. Дополнительные сведения см. в разделе about_Variables.
Создание файла
Эта команда создает log2.txt файл в C:\logfiles каталоге, а затем добавляет в файл строку "Журнал теста":
Powershell Get-Member на примере свойств и методов файла
Получим список файлов из любой директории подобным образом:
Мы можем увидеть, что некоторые методы похожи на командлеты PS. Например выделенный мною будет делать примерно то же (без расширенных возможностей), что и Remove-Item:
Выполнить этот метод мы можем так:
Есть так же метод, который проверит существование файла. Для примера у нас может создаваться бэкап по определенному пути и мы хотим проверять что планировщик выполнил эту задачу. Мы можем проверить через powershell наличие файла используя Exist:
У файлов много свойств и для примера я хочу получить разные даты файлов в powershell. Я знаю, что все даты хранятся в типах данных datetime и по этому значению я могу отфильтровать:
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
Добавление содержимого в файл
Эта команда добавляет строку "тестовое содержимое" в Test.txt файл:
Существующее содержимое в Test.txt файле не удаляется.
Поиск файлов по содержимому
Get-Content не позволяет искать и открывать фалы находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.
В следующем примере мы вернем файлы из всех каталогов и подкаталогов:
File - возвращает только файлы. Каталоги нам не нужны.
С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.
Через конвейер мы сможем открыть каждый файл, а с Select-Sting проверить есть ли в нем нужный текст. Так мы найдем файл с Powershell, который содержит строку '127.0.0.1' в папке Windows:
Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:
Создание и задание списка управления доступом для файла
Читайте также: