PowerShell. Работа с файлами, импорт и экспорт объектов в текстовые файлы.

В данной статье описано, как записать и получить данные из файла при работе с PowerShell.

В этой статье описаны следующие темы:
Операторы перенаправления
Командлеты Set-Content, Add-Content
Командлет Out-File
Командлет Tee-Object
Командлет Get-Content
Командлет Export-CSV
Командлет Import-Csv
Командлет Import-Clixml
Командлет Export-Clixml

Операторы перенаправления.

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

Для того, что бы перенаправить поток консольного вывода в файл, необходимо после команды написать знак «>» ,если нужно затереть данные в файле, или «>>» , если данные надо дописать в конец файла, а потом полный путь к файлу.

Пример:

Первая команда «Get-ChildItem» выводит свой результат работы в консоль,

Вторая «Get-ChildItem > 1.txt» записывает результат работы в файл «1.txt» текущей директории.

Рассмотрим ещё один пример:

После выполнения команд файл 1.txt останется пустым. А ошибка отобразилась в консоли. Если поток ошибок надо так же перенаправить в файл, то в конце команды надо дописать 2>&1.

Пример:

После выполнения команды в файле будет записан как и результат выполнения команды, так и ошибки:

В этом примере мы перенаправили второй поток вывода в первый, а первый поток записали в файл.

 

В PowerShell существуют следующие потоки:

Поток Варианты использования Описание
0 Поток ввода
1 >filename|>>filename Поток информационных сообщений
2 2>filename|2>>filename|2>&1 Поток сообщений с ошибоками
В PowerShell 3.0 появилось ещё несколько потоков:
3 3>filename|3>>filename|3>&1 Поток предупреждений.
4 4>filename|4>>filename|4>&1 Поток подробного вывода.
5 5>filename|5>>filename|5>&1 Поток диагностики.
* *>filename|*>>filename Все потоки.

 

 

Set-Content, Add-Content

Так же для записи в файл можно использовать командлеты Set-Content и Add-Content. Эти командлеты заменяет все данные в файле на указанные. Перед записью они преобразовывают объекты в строки и не всегда удобны. Зато они могут использоваться для массового изменения файлов. Простейшая их запись выглядит так:

Данная команда заменит все данные в файле 1.txt на Слово «Hello». Если файла на момент запуска нет, то он создастся.

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

 

-Value «Объект для записи»

В этом параметре нужно указывать новое содержимое элементов.

Пример:

Данная команда изменит содержимое файла «1.txt» на «Hello»

Ещё пример:

Добавляет к файлу 1.txt, текущей дирректории, две строки «Hello1» и «Hello2»

Название параметра можно опустить, тогда предыдущие примеры будет выглядеть так:

Данный параметр, так же можно передавать по контейнеру.

Но в файл попадут не данные как на консоли,  а преобразованные в текстовые строки объекты.

Пример:

Тоже самое произойдёт, если в параметр -value передать переменную:

 

-LiteralPath «путь до файла(ов)»

В этом параметре надо указывать точный путь до файла. Можно использовать перечисление файлов, через  «,» (запятую).

Данная команда изменит данные в файлах текущей директории «1.txt» и «2.txt» на «Hello»

или можно добавить данные:

 

-Path «строка с шаблоном пути до файлов»

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

Например команда:

Заменит содержимое всех файлов в дирректории «C:\temp\» с типом *.txt на «Hello».

Можно так же добавить строку «Hello» к файлам в дирректории «C:\temp\» и «C:\temp2\» одним командлетом:

 

-Force

Параметр -Force позволяет проводить действия, даже с файлами у которых стоит атрибут «Только на чтение».

При выполнении команды «Set-content -Path «C:\temp\1.txt» -value «33»». Появилась ошибка, так как на файле стоит атрибут «только на чтение», вторая команда прошла успешно.

Тоже самое и для Add-Content:

 

-Filter «шаблон имени»

В этом параметре можно указать шаблон имени файла.

Пример:

Данная команда заменит значение всех файлов с типом «*.txt» в дирректриях «C:\temp» и «C:\temp2»

 

-Include «шаблоны имён»

В отличии от параметра «-Filter»  в -Include можно указывать несколько шаблонов одновременно.

Пример:

В этой команде заменится содержимое всех файлов с типом «*.txt» и «.doc» в директориях «C:\temp» и «C:\temp2»

или добавить содержимое:

 

-Exclude «Шаблон исключений пути файлов»

Данный параметр отбрасывает файлы удовлетворяющие «Шаблон исключений пути файлов», из списка найденных по шаблону в параметре «-Path». Но не влияет на файлы указанные в параметре -LiteralPath.

Пример:

Данная команда установит содержимое всех файлов с типом «txt» на 22, кроме текстовых файлов у которых имя файла без типа, содержит один символ.

Так же и для Add-Content:

 

-PassThru

Данный параметр позволяет передать объекты дальше по контейнеру, или вывести объекты на консоль, если данный командлет является последним.

Пример:

 

-Confirm

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

Пример:

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

 

 

Out-File

В простейшем варианте этот командлет выглядит так:

При выполнении данной команды, get-childitem передаст содержимое каталога на командлет Out-File, а он запишет его в файл «2.txt» в текущем каталоге. При этом если файл «2.txt» существует, то командлет его перезапишет.

Out-File может принимать следующие параметры:

 

-FilePath «Имя файла»

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

Имя данного параметра можно опустить, как мы и сделали в предыдущем примере.

Полная запись будет выглядеть так:

 

-Append

При указании данного параметра данные будут дописываться, а не затираться.

Тоесть если мы запустим команду:

То данные будут дописываться в конец файла «2.txt».

 

-NoClobber

Данный параметр предотвращает перезапись существующих данных.

Если запусnить команду :

При уже имеющемся файле 2.txt

То получится ошибка:

Однако с параметром -Append

Сохранности данных ничего не угрожает и данные благополучно допишутся в конец файла.

 

-Confirm

Параметр указывает, что перед выполнением команды у пользователя будет запрошено подтвержение.

При выполнении данной команды:

Выведется следующее сообщение:

 

-Force

Перезаписать файл с атрибутом «Только на чтение».

То есть команда:

Позволяет переписать файл 2.txt даже если в Атррибуте будет стоят галочка «Только на чтение».

PowershellAndFiles3

При этом после записи в этот файл, галка не уберётся.

 

-Encoding «Тип кодировки»

Задаёт метод кодировки в файле можно писать файл в следующих кодировках: «Unicode», «UTF7», «UTF8», «UTF32», «ASCII», «BigEndianUnicode» и «OEM». По умолчанию использует кодировку «Unicode».

Пример:

 

-InputObject «Переменная»

Данный параметр позволяет сохранять в файл объект. При этом отображение этого объекта в консоли и сохраннёные данные в файл, могут визуально не совпадать

Например создадим вложенный массив :

Посмотрим на массив:

В данном примере и в файле и в консоле будет одно и тоже:

Запишем объект массива в файл, через параметр -InputObject:

Теперь в консоли будет выводиться :

А в файл :

 

-Width «Ширина в символах»

Указывает максимальное кол-во символов в строке, при превышении данного значения, строка обрезается.

Пример:

Получился вот такой файл:

 

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

 

 

Tee-Object

Этот командлет сохраняет отображаемые объекты и передаёт их дальше по контейнеру.

Пример:

Данная команда сначала выполнит «Get-ChildItem *.txt»   получит список всех файлов заканчивающихся на *.txt, и передаст их  Tee-Object 3.txt. Tee-Object 3.txt сохранит список всех файлов в файле 3.txt, и передаст список дальше. Get-Content выведет всё содержимое файлов на консоль.

 

-FilePath

«Tee-Object 3.txt» это сокращённа форма записи, мы опустили имя свойства «FilePath» Которое указывает в какой файл записать данные.

Пример:

Так же с помощью свойства

 

-Variable «Имя переменной»

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

Пример:

После выполнения этой команды в переменной $listfile будет содержаться объект типа System.IO.FileInfo

Так же как и в Out-File в Tee-Object можно передать переменную на командлет:

 

-InputObject «Переменная»

Пример:

 

Только в PoverShell 3.0 Tee-Object научился дописывать в файл с помощью параметра

-Append

При использовании данного параметра файл будет не перезаписываться, а данные будут дописываться в конец файла.

Пример:

После выполнения данной командой данные допишутся в конец файла 3.txt, а не будут перезаписывать файл.

 

 

Get-Content

Для того, что бы получать данные из текстовых файлов, имеется командлет Get-Content.

У него есть ряд параметров, которые работают так же как и в Set-Content:

 

-LiteralPath «Путь до файла»

Задает путь к элементу. В отличие от значения параметра Path, значение параметра LiteralPath используется точно в том виде, в котором оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, его нужно заключить в одиночные кавычки. Одиночные кавычки указывают оболочке Windows PowerShell, что никакие символы не следует интерпретировать как escape-символы.

Пример:

Команда выводит последовательно  3 раза файл 1.txt. Если перенаправить это в файл, то можно склеить несколько текстовых файлов в один:

 

-Path «Шаблоны для файлов»

Задает путь к элементу. Для извлечения содержимого используется командлет Get-Content. Подстановочные знаки разрешены. Имя параметра («Path» или «FilePath») указывать необязательно.

Пример:

Данная команда записывает содержимое всех файлов с типом «.txt» в файл «5.txt» текущей директории.

 

-Filter «шаблон файлов»

Задает фильтр с использованием формата или языка поставщика. Значение этого параметра определяет значение параметра Path. Синтаксис фильтра, в том числе использование подстановочных знаков, зависит от поставщика. Фильтры эффективнее других параметров, потому что поставщик применяет их при извлечении объектов (вместо использования Windows PowerShell для фильтрации извлеченных объектов).

Пример:

В данном примере у меня в директории «C:\temp2\» нет файлов с типом «*.csv», поэтому возникает данная ошибка, однако все csv файлы из директории «C:\temp\» успешно записались в файл «5.csv»

 

-Include «шаблоны файлов»

Извлекает только указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Пример:

Записывает в файл 6.txt всё содержимое файлов с типом «*.csv» «*.txt» в дирректории «C:\Temp» .

 

-Exclude «шаблоны файлов»

Исключает указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Пример:

Записывает в файл 6.doc все файлы из дирректории «C:\temp\*» не содержащие типов «*.txt» и «*.csv»

 

-Force

Переопределяет ограничения, препятствующие выполнению команды, не ставя под угрозу безопасность. Например, параметр Force позволяет переопределить атрибут «только чтение» .

 

И два особенных параметра:

 

-TotalCount «Число отображаемых срок»

Данный параметр задает количество извлекаемых строк содержимого. По умолчанию используется значение -1 (все строки).

Данная команда вывела ровно 5 строк из файла 1.txt

 

-ReadCount «Число строк»

Задаёт количество строк передаваемых по конвееру.

Пример:

На примере видно, что строки передаются по 5 штук.

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

 

Данные команды конечно расширяют возможности работы с данными в файлах Powershell, но полученные данные с помощью операторов перенаправления или командлетами Out-File и Tee-Object больше подходят для логирования процессов, нежели  для анализа данных. К тому же использовать полученные данные в дальнейших скриптах не тривиальная задача. Для решения этих проблем в PowerShell есть командлеты Import-CSV,Export-CSV, Export-Clixml, Import-Clixml. Рассмотрим их по отдельности:

 

Export-CSV

Раз я веду разговор о записи в файл, именно этот командлет мне нужен. Но стоит упоменуть о командлете ConvertTo-CSV. Так как  Export-CSV выполняет все действия ConvertTo-CSV, а после записывает в файл. Поэтому если вам не хватает функционала работы с файлами командлета  Export-CSV то вы можете конвертировать объекты PowerShell с помощью ConvertTo-CSV, а помом записать полученный результат удобным вам способом.

Рассмотрим свойства данного командлета:

 

-Path «путь к файлу»

Данный параметр обязательный и задаёт имя файла, в который будут записываться данные.

Рассмотрим пример:

Сначала получаем список файлов директории «Get-ChildItem *.*» ипередаём по конвееру. Выбираем свойства объекта «Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length» и передаём их на экспорт. После экспортируем их в файл 1.csv c помощью командлета  Export-Csv 1.csv, мы опустили название свойства -Path в полном варианте записи командлет выглядел бы как: Export-Csv -Path 1.csv

У нас в итоге получился файл 1.csv который можно открыть в большенстве табличных редакторах.

 

-Force

Параметр Force — позволяет перезаписать файл с выставленным атрибутом «только на чтение» в тихом режиме.

Пример:

 

-NoClobber

Данный параметр предотвращает перезаписать файла.

 

-Confirm

Ещё один способ избежать перезаписи, ручной конроль данной операции «-Confirm». Если указать параметр Confirm, то при выполнении команды будет выведен запрос на подтверждение выполнения команды.

Пример:

 

-NoTypeInformation

Убирает из файла строчку с данныйми о типах

После выполнения данной команды:

Получается вот такой файл:

Первой строчки «#TYPE Selected.System.IO.FileInfo» нет.

 

-Delimiter «Разделитель столбцов»

Этим параметром можно переназначить разделитель на любой символ. По умолчанию разделителем является «,»(запятая).

Пример:

В результате получится следующий файл:

 

-UseCulture

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

Пример использования:

При моих настройках компьютера:

Разделителем является «;».

И соответсвенно получился вот такой файл:

 

-Encoding «кодировка»

Позволяет задать кодировку конечного файла. Может принимать следующие значения «Unicode», «UTF7», «UTF8», «ASCII», «UTF32», «BigEndianUnicode», «OEM».

По умолчанию используется «ASCII»

Пример:

 

-InputObject «переменная»

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

Пример:

Получился вот такой файл.

 

 

Import-Csv

Для импорта файлов Csv в переменные, существует командлет Import-csv. При экспорте, а потом импорте объектов с объектом происходит ряд трансформаций.Теряются методы объекта, вместо них появляются методы Equals, GetHashCode, GetType и ToString.  Все свойсва объекта конвертируются в их строковые версии.

Так же Import-Csv может Загрузить в объект файл который ни когда не являлся объектом PowerShell.

 

Рассмотрим параметры данного командлета:

 

-Path «путь к csv файлу»

Этот параметр задаёт путь к файлу, из которого будут загружаться данные.

Рассмотрим пример:

Здесь мы сначала экспортировали данные директории в сsv файл, вот такого содержания:

и т.д.

далее импортировали его в переменную $a

при выводе переменной $a мы увидели свойства дирректории…

Посмотрим на эту переменную внимательней:

Мы увидем, что свойства этой переменной имеют тип System.String, а так же у нас отсутствуют методы :

Свойственные типу System.IO.FileInfo

 

-Header «Заголовок»

У файла который мы будем импортировать можно добавить заголовок параметром Header

Попытаемся импортировать файл 1.csv с изменённым заголовком:

Заметим, что свойства на которых не хватило именования не вошли в переменную $a, если бы в шапке оказалось бы больше именований столбцов, чем свойств в файле. То свойстива с этими именами остались бы пустыми.

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

Как и у Export-CSV у Import-Csv есть параметры отвечающие за разделители:

 

-Delimiter «Символ разделитель»

Можно указать какой разделитель используется у исходного файла.

Как пример:

 

-UseCulture

Использовать в качестве разделителя символ соответствующий настройкам текущего компьютера

Пример:

Экспорт и импорт объектов с помощью командлетов Export-Csv и Import-Csv  удобен в некоторых ситуациях. Но этот тип экпорта-импорта не предусматривает наличие вложенных объектов. Данную проблему решают командлеты Export-Clixml и Import-Clixml.

 

 

Import-Clixml

Import-Clixml не имеет ни каких особенных параметров, кроме -Path, В котором надо указывать путь к файлу для импорта.

 

 

Export-Clixml

Так же как и Export-Csv командлет Export-Clixml содержит параметры Path, Encoding, InputObject, Force, NoClobber, Confirm. Они работают точно так же как и в Export-Csv:

 

-Path «путь к файлу»

Задает путь к файлу, в котором будет сохранено XML-представление объекта.

Пример:

 

-Encoding

Задает кодировку целевого файла. Допустимые значения: ASCII, UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, Default и OEM. По умолчанию используется значение UTF8.

Пример:

 

-InputObject

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

Пример:

 

-Force

Указывает командлету снять для файла вывода атрибут «только чтение», если это необходимо.  Когда выполнение команды завершится, командлет попытается заново установить атрибут «только чтение».

 

-NoClobber

Не позволяет командлету перезаписать содержимое существующего файла. По умолчанию если файл существует по указанному пути, командлет Export-Clixml перезаписывает файл без предупреждения.

Пример ошибки, если файл уже существует:

 

-Confirm

Запрашивает подтверждение перед выполнением команды.

 

Новый параметр один и называется :

 

-Depth «число уровня вложенности»

Рассмотрим пример:

Сделаем импор-экспорт дирректории с 3 уровнем вложенности и сохраним в переменную $d

При этом $d[0] это у нас каталог ru-RU

Посмотрим родительские каталоги его родительских каталогов:

При этом родительский каталог, родительского каталога имеет тип Deserialized.System.IO.DirectoryInfo

А его родительский каталог является уже System.String:

 

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *