В данной статье описано, как записать и получить данные из файла при работе с PowerShell.
В этой статье описаны следующие темы:
Операторы перенаправления
Командлеты Set-Content, Add-Content
Командлет Out-File
Командлет Tee-Object
Командлет Get-Content
Командлет Export-CSV
Командлет Import-Csv
Командлет Import-Clixml
Командлет Export-Clixml
Операторы перенаправления.
В powershell, как и в командной строке есть способ перенаправить поток вывода и ошибок в файл. Как и в командной строке в PowerShell существуют операторы перенаправления.
Для того, что бы перенаправить поток консольного вывода в файл, необходимо после команды написать знак «>» ,если нужно затереть данные в файле, или «>>» , если данные надо дописать в конец файла, а потом полный путь к файлу.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
PS C:\temp> Get-ChildItem Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 29.07.2015 13:27 4472 1.csv -a--- 30.07.2015 13:02 0 1.txt PS C:\temp> Get-ChildItem > 1.txt PS C:\temp> PS C:\temp> Get-Content 1.txt Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 29.07.2015 13:27 4472 1.csv -a--- 30.07.2015 13:15 788 1.txt |
Первая команда «Get-ChildItem» выводит свой результат работы в консоль,
Вторая «Get-ChildItem > 1.txt» записывает результат работы в файл «1.txt» текущей директории.
Рассмотрим ещё один пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PS C:\temp> Get-ChildItem skdjfsdlj Get-ChildItem : Не удается найти путь "C:\temp\skdjfsdlj", так как он не существует. строка:1 знак:4 + dir <<<< skdjfsdlj + CategoryInfo : ObjectNotFound: (C:\temp\skdjfsdlj:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand PS C:\temp> Get-ChildItem skdjfsdlj > 1.txt Get-ChildItem : Не удается найти путь "C:\temp\skdjfsdlj", так как он не существует. строка:1 знак:4 + dir <<<< skdjfsdlj > 1.txt + CategoryInfo : ObjectNotFound: (C:\temp\skdjfsdlj:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand PS C:\temp> |
После выполнения команд файл 1.txt останется пустым. А ошибка отобразилась в консоли. Если поток ошибок надо так же перенаправить в файл, то в конце команды надо дописать 2>&1.
Пример:
1 |
Get-ChildItem lkdjflds >1.txt 2>&1 |
После выполнения команды в файле будет записан как и результат выполнения команды, так и ошибки:
1 2 3 4 5 6 7 8 9 10 |
PS C:\temp> Get-ChildItem asdfsadf > 1.txt 2>&1 PS C:\temp> PS C:\temp> Get-content 1.txt Get-ChildItem : Не удается найти путь "C:\temp\asdfsadf", так как он не существует. строка:1 знак:14 + Get-ChildItem <<<< asdfsadf > 1.txt 2>&1 + CategoryInfo : ObjectNotFound: (C:\temp\asdfsadf:String) [Get-ChildItem], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand PS C:\temp> |
В этом примере мы перенаправили второй поток вывода в первый, а первый поток записали в файл.
В 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 |
Set-content 1.txt "Hello" |
1 |
Add-content 1.txt "Hello" |
Данная команда заменит все данные в файле 1.txt на Слово «Hello». Если файла на момент запуска нет, то он создастся.
При работе с файловой системой командлеты могут применять следующие параметры:
-Value «Объект для записи»
В этом параметре нужно указывать новое содержимое элементов.
Пример:
1 |
Set-content 1.txt -value "Hello" |
Данная команда изменит содержимое файла «1.txt» на «Hello»
Ещё пример:
1 2 |
PS C:\Temp> Add-content -Path 1.txt -value "Hello1","Hello2" PS C:\Temp> |
Добавляет к файлу 1.txt, текущей дирректории, две строки «Hello1» и «Hello2»
Название параметра можно опустить, тогда предыдущие примеры будет выглядеть так:
1 |
Set-content 1.txt "Hello" |
1 |
Add-content -Path 1.txt "Hello1","Hello2" |
Данный параметр, так же можно передавать по контейнеру.
Но в файл попадут не данные как на консоли, а преобразованные в текстовые строки объекты.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
PS C:\temp> Get-ChildItem Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 30.07.2015 16:34 4 1.csv -a--- 30.07.2015 16:45 83 1.txt -a--- 30.07.2015 15:04 8 1.xml -a--- 30.07.2015 16:34 4 2.csv -a--- 30.07.2015 16:34 4 2.txt -a--- 30.07.2015 15:04 8 2.xml -a--- 30.07.2015 16:34 4 212.txt -a--- 30.07.2015 16:34 4 22.txt -a--- 30.07.2015 16:34 4 3.txt -a--- 30.07.2015 15:04 8 3.xml -a--- 30.07.2015 16:34 4 temp.txt PS C:\temp> Get-ChildItem | Set-Content 1.txt PS C:\temp> Get-Content 1.txt 1.csv 1.txt 1.xml 2.csv 2.txt 2.xml 212.txt 22.txt 3.txt 3.xml temp.txt |
Тоже самое произойдёт, если в параметр -value передать переменную:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Path[0]: PS C:\temp> $a=Get-ChildItem PS C:\temp> Set-Content 1.txt -value $a PS C:\temp> Set-Content 2.txt -value $a PS C:\temp> Get-Content 2.txt 1.csv 1.txt 1.xml 2.csv 2.txt 2.xml 212.txt 22.txt 3.txt 3.xml temp.txt |
-LiteralPath «путь до файла(ов)»
В этом параметре надо указывать точный путь до файла. Можно использовать перечисление файлов, через «,» (запятую).
1 |
PS C:\temp> Set-content -literalPath 1.txt , 2.txt "Hello" |
Данная команда изменит данные в файлах текущей директории «1.txt» и «2.txt» на «Hello»
или можно добавить данные:
1 |
Add-content -literalPath 1.txt , 2.txt "Hello" |
-Path «строка с шаблоном пути до файлов»
Данный параметр подставляется автоматически если его не указывать явно и в нём указываются шаблон для файлов, которые будут подвергаться изменению.
Например команда:
1 |
Set-content C:\temp\*.txt "Hello" |
Заменит содержимое всех файлов в дирректории «C:\temp\» с типом *.txt на «Hello».
Можно так же добавить строку «Hello» к файлам в дирректории «C:\temp\» и «C:\temp2\» одним командлетом:
1 |
Set-content C:\temp\*,C:\temp2\* "Hello" |
-Force
Параметр -Force позволяет проводить действия, даже с файлами у которых стоит атрибут «Только на чтение».
1 2 3 4 5 6 7 8 9 |
PS C:\temp> Set-content -Path "C:\temp\1.txt" -value "33" Set-Content : Отказано в доступе по пути "C:\temp\1.txt". строка:1 знак:12 + Set-content <<<< -Path "C:\temp\1.txt" -value "33" + CategoryInfo : NotSpecified: (:) [Set-Content], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetContentCommand PS C:\temp> Set-content -Path "C:\temp\1.txt" -value "33" -force PS C:\temp> |
При выполнении команды «Set-content -Path «C:\temp\1.txt» -value «33»». Появилась ошибка, так как на файле стоит атрибут «только на чтение», вторая команда прошла успешно.
Тоже самое и для Add-Content:
1 2 3 4 5 6 7 8 9 |
PS C:\temp> Add-Content -Path "C:\temp\1.txt" -value "33" Add-Content : Отказано в доступе по пути "C:\temp\1.txt". строка:1 знак:12 + Add-Content <<<< -Path "C:\temp\1.txt" -value "33" + CategoryInfo : NotSpecified: (:) [Set-Content], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetContentCommand PS C:\temp> Add-Content -Path "C:\temp\1.txt" -value "33" -force PS C:\temp> |
-Filter «шаблон имени»
В этом параметре можно указать шаблон имени файла.
Пример:
1 |
PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Filter "*.txt" -value "Hello2" |
Данная команда заменит значение всех файлов с типом «*.txt» в дирректриях «C:\temp» и «C:\temp2»
-Include «шаблоны имён»
В отличии от параметра «-Filter» в -Include можно указывать несколько шаблонов одновременно.
Пример:
1 |
PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt" |
В этой команде заменится содержимое всех файлов с типом «*.txt» и «.doc» в директориях «C:\temp» и «C:\temp2»
или добавить содержимое:
1 |
PS C:\temp> Add-Content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt" |
-Exclude «Шаблон исключений пути файлов»
Данный параметр отбрасывает файлы удовлетворяющие «Шаблон исключений пути файлов», из списка найденных по шаблону в параметре «-Path». Но не влияет на файлы указанные в параметре -LiteralPath.
Пример:
1 |
PS C:\temp> Set-content -Path *.txt -Exclude ?.txt "22" |
Данная команда установит содержимое всех файлов с типом «txt» на 22, кроме текстовых файлов у которых имя файла без типа, содержит один символ.
Так же и для Add-Content:
1 |
PS C:\temp> Add-Content -Path *.txt -Exclude ?.txt "22" |
-PassThru
Данный параметр позволяет передать объекты дальше по контейнеру, или вывести объекты на консоль, если данный командлет является последним.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
PS C:\temp> Get-ChildItem | Set-Content 1.txt -PassThru |gm TypeName: System.Object[] Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length Address Method System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934... Clone Method System.Object Clone() CopyTo Method System.Void CopyTo(array array, int index), System.Void CopyTo(array array, long index) Equals Method bool Equals(System.Object obj) Get Method System.Object Get(int ) |
-Confirm
Данный параметр указывает, что перед выполнение командлета, необходимо запросить у пользователя подтверждение на выполнения команды.
Пример:
1 2 3 4 5 6 7 8 |
PS C:\temp> Set-Content 1.txt "Hello" -Confirm Подтверждение Вы действительно хотите выполнить это действие? Выполнение операции "Установка содержимого" над целевым объектом "Путь: C:\temp\1.txt". [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"):N PS C:\temp> |
Данные командлеты позволяют писать в файл только строки, для записи в файл объектов используются следующие командлеты:
Out-File
В простейшем варианте этот командлет выглядит так:
1 |
get-childitem | Out-File 2.txt |
При выполнении данной команды, get-childitem передаст содержимое каталога на командлет Out-File, а он запишет его в файл «2.txt» в текущем каталоге. При этом если файл «2.txt» существует, то командлет его перезапишет.
Out-File может принимать следующие параметры:
-FilePath «Имя файла»
В этом параметре нужно указывать имя файла или полный путь до файла в который будет записаны данные.
Имя данного параметра можно опустить, как мы и сделали в предыдущем примере.
Полная запись будет выглядеть так:
1 |
get-childitem | Out-File -FilePath 2.txt |
-Append
При указании данного параметра данные будут дописываться, а не затираться.
Тоесть если мы запустим команду:
1 |
get-childitem | Out-File -FilePath 2.txt -Append |
То данные будут дописываться в конец файла «2.txt».
-NoClobber
Данный параметр предотвращает перезапись существующих данных.
Если запусnить команду :
1 |
get-childitem | Out-File -FilePath 2.txt -NoClobber |
При уже имеющемся файле 2.txt
То получится ошибка:
1 2 3 4 5 |
Out-File : Файл "C:\temp\2.txt" уже существует. строка:1 знак:25 + get-childitem | Out-File <<<< -FilePath 2.txt -NoClobber + CategoryInfo : ResourceExists: (C:\temp\2.txt:String) [Out-File], IOException + FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.OutFileCommand |
Однако с параметром -Append
1 |
get-childitem | Out-File -FilePath 2.txt -NoClobber -Append |
Сохранности данных ничего не угрожает и данные благополучно допишутся в конец файла.
-Confirm
Параметр указывает, что перед выполнением команды у пользователя будет запрошено подтвержение.
При выполнении данной команды:
1 |
get-childitem | Out-File -FilePath 2.txt -Confirm |
Выведется следующее сообщение:
1 2 3 4 5 |
Подтверждение Вы действительно хотите выполнить это действие? Выполнение операции "Вывод в файл" над целевым объектом "2.txt". [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"): |
-Force
Перезаписать файл с атрибутом «Только на чтение».
То есть команда:
1 |
get-childitem 234234f 2>&1 | Out-file 2.txt -force |
Позволяет переписать файл 2.txt даже если в Атррибуте будет стоят галочка «Только на чтение».
При этом после записи в этот файл, галка не уберётся.
-Encoding «Тип кодировки»
Задаёт метод кодировки в файле можно писать файл в следующих кодировках: «Unicode», «UTF7», «UTF8», «UTF32», «ASCII», «BigEndianUnicode» и «OEM». По умолчанию использует кодировку «Unicode».
Пример:
1 |
get-childitem 234234f 2>&1 | Out-file 2.txt -Encoding "ASCII" |
-InputObject «Переменная»
Данный параметр позволяет сохранять в файл объект. При этом отображение этого объекта в консоли и сохраннёные данные в файл, могут визуально не совпадать
Например создадим вложенный массив :
1 2 3 |
$a1 = 1,2,3 $a2 = $a1,$a1,$a1 |
Посмотрим на массив:
1 |
$a2|Out-File 2.txt; $a2 |
В данном примере и в файле и в консоле будет одно и тоже:
1 2 3 4 5 6 7 8 9 |
1 2 3 1 2 3 1 2 3 |
Запишем объект массива в файл, через параметр -InputObject:
1 |
Out-File -InputObject $a2 2.txt;$a2 |
Теперь в консоли будет выводиться :
1 2 3 4 5 6 7 8 9 |
1 2 3 1 2 3 1 2 3 |
А в файл :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 |
-Width «Ширина в символах»
Указывает максимальное кол-во символов в строке, при превышении данного значения, строка обрезается.
Пример:
1 |
Get-ChildItem |Out-File .\2.txt -Width 40 |
Получился вот такой файл:
1 2 3 4 5 6 7 8 9 10 11 |
Каталог: C:\temp ПРЕДУПРЕЖДЕНИЕ: столбец Name не поместил ся на экране и был удален. Mode LastWriteTime Length ---- ------------- ------ -a--- 21.07.2015 12:39 117 -a--- 21.07.2015 17:33 458 -a--- 21.07.2015 16:43 1709 |
Данный инструмент намного функциональней, чем просто перенаправление в файл, но он как и перенаправление имеет один не достаток, эти способы могут быть только в конце контейнера. И после данных выводов в файл объекты дальше не передаются. Это позволяет избежать следующий командлет:
Tee-Object
Этот командлет сохраняет отображаемые объекты и передаёт их дальше по контейнеру.
Пример:
1 |
Get-ChildItem *.txt|Tee-Object 3.txt |Get-Content |
Данная команда сначала выполнит «Get-ChildItem *.txt» получит список всех файлов заканчивающихся на *.txt, и передаст их Tee-Object 3.txt. Tee-Object 3.txt сохранит список всех файлов в файле 3.txt, и передаст список дальше. Get-Content выведет всё содержимое файлов на консоль.
-FilePath
«Tee-Object 3.txt» это сокращённа форма записи, мы опустили имя свойства «FilePath» Которое указывает в какой файл записать данные.
Пример:
1 |
Tee-Object -FilePath 3.txt |
Так же с помощью свойства
-Variable «Имя переменной»
имеется возможность сохранять данные объекты не в файл, а в переменную.
Пример:
1 |
Get-ChildItem *.txt|Tee-Object -Variable listfile |Get-Content |
После выполнения этой команды в переменной $listfile будет содержаться объект типа System.IO.FileInfo
Так же как и в Out-File в Tee-Object можно передать переменную на командлет:
-InputObject «Переменная»
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
PS C:\temp> Tee-Object -InputObject $a2 -Variable a3 Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 Length : 3 LongLength : 3 Rank : 1 SyncRoot : {1, 2, 3} IsReadOnly : False IsFixedSize : True IsSynchronized : False Count : 3 PS C:\temp> $a3 1 2 3 1 2 3 1 2 3 |
Только в PoverShell 3.0 Tee-Object научился дописывать в файл с помощью параметра
-Append
При использовании данного параметра файл будет не перезаписываться, а данные будут дописываться в конец файла.
Пример:
1 |
Get-ChildItem *.txt|Tee-Object 3.txt -Append|Get-Content |
После выполнения данной командой данные допишутся в конец файла 3.txt, а не будут перезаписывать файл.
Get-Content
Для того, что бы получать данные из текстовых файлов, имеется командлет Get-Content.
У него есть ряд параметров, которые работают так же как и в Set-Content:
-LiteralPath «Путь до файла»
Задает путь к элементу. В отличие от значения параметра Path, значение параметра LiteralPath используется точно в том виде, в котором оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, его нужно заключить в одиночные кавычки. Одиночные кавычки указывают оболочке Windows PowerShell, что никакие символы не следует интерпретировать как escape-символы.
Пример:
1 2 3 4 |
PS C:\Temp> Get-content -LiteralPath C:\temp\1.txt,C:\temp\1.txt,C:\temp\1.txt Hello Hello Hello |
Команда выводит последовательно 3 раза файл 1.txt. Если перенаправить это в файл, то можно склеить несколько текстовых файлов в один:
1 |
PS C:\Temp> Get-content -LiteralPath C:\temp\1.txt,C:\temp\1.txt,C:\temp\1.txt|set-content 4.txt |
-Path «Шаблоны для файлов»
Задает путь к элементу. Для извлечения содержимого используется командлет Get-Content. Подстановочные знаки разрешены. Имя параметра («Path» или «FilePath») указывать необязательно.
Пример:
1 |
PS C:\Temp> Get-content -Path C:\temp\*.txt |set-content 5.txt |
Данная команда записывает содержимое всех файлов с типом «.txt» в файл «5.txt» текущей директории.
-Filter «шаблон файлов»
Задает фильтр с использованием формата или языка поставщика. Значение этого параметра определяет значение параметра Path. Синтаксис фильтра, в том числе использование подстановочных знаков, зависит от поставщика. Фильтры эффективнее других параметров, потому что поставщик применяет их при извлечении объектов (вместо использования Windows PowerShell для фильтрации извлеченных объектов).
Пример:
1 2 3 4 5 6 7 8 |
PS C:\Temp> Get-content -Path C:\temp\*,C:\temp2\* -filter *.csv |set-content 5.csv Get-Content : Объект для указанного пути C:\temp\* не существует или отфильтрован с помощью параметра -Include или -Exc lude. строка:1 знак:12 + Get-content <<<< -Path C:\temp\*,C:\temp2\* -filter *.csv |set-content 5.csv + CategoryInfo : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand PS C:\Temp> |
В данном примере у меня в директории «C:\temp2\» нет файлов с типом «*.csv», поэтому возникает данная ошибка, однако все csv файлы из директории «C:\temp\» успешно записались в файл «5.csv»
-Include «шаблоны файлов»
Извлекает только указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.
Пример:
1 |
PS C:\Temp> Get-content -Path C:\temp\* -Include *.csv,*.txt |set-content 6.txt |
Записывает в файл 6.txt всё содержимое файлов с типом «*.csv» «*.txt» в дирректории «C:\Temp» .
-Exclude «шаблоны файлов»
Исключает указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.
Пример:
1 |
Get-content -Path C:\temp\* -Exclude *.txt,*.csv |set-content 6.doc |
Записывает в файл 6.doc все файлы из дирректории «C:\temp\*» не содержащие типов «*.txt» и «*.csv»
-Force
Переопределяет ограничения, препятствующие выполнению команды, не ставя под угрозу безопасность. Например, параметр Force позволяет переопределить атрибут «только чтение» .
1 |
PS C:\Temp> Get-content -Path C:\temp\* -force |
И два особенных параметра:
-TotalCount «Число отображаемых срок»
Данный параметр задает количество извлекаемых строк содержимого. По умолчанию используется значение -1 (все строки).
1 2 3 4 5 6 7 |
PS C:\temp> Get-Content 1.txt -TotalCount 5 1 line 2 line 3 line 4 line 5 line PS C:\temp> |
Данная команда вывела ровно 5 строк из файла 1.txt
-ReadCount «Число строк»
Задаёт количество строк передаваемых по конвееру.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PS C:\temp> Get-Content 1.txt -ReadCount 5 |foreach{$_+"-------"} 1.csv 1.txt 1.xml 2.csv 2.txt ------- 2.xml 212.txt 22.txt 3.txt 3.xml ------- temp.txt ------- PS C:\temp> |
На примере видно, что строки передаются по 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 «путь к файлу»
Данный параметр обязательный и задаёт имя файла, в который будут записываться данные.
Рассмотрим пример:
1 |
Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv |
Сначала получаем список файлов директории «Get-ChildItem *.*» ипередаём по конвееру. Выбираем свойства объекта «Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length» и передаём их на экспорт. После экспортируем их в файл 1.csv c помощью командлета Export-Csv 1.csv, мы опустили название свойства -Path в полном варианте записи командлет выглядел бы как: Export-Csv -Path 1.csv
У нас в итоге получился файл 1.csv который можно открыть в большенстве табличных редакторах.
1 2 3 4 5 6 |
#TYPE Selected.System.IO.FileInfo "FullName","CreationTime","LastWriteTime","Attributes","Length" "C:\temp\1.csv","22.07.2015 10:54:38","22.07.2015 11:02:04","Archive","0" "C:\temp\1.txt","21.07.2015 12:37:21","21.07.2015 12:39:14","Archive","117" "C:\temp\2.txt","21.07.2015 13:52:47","22.07.2015 9:14:34","Archive","46" "C:\temp\3.txt","21.07.2015 16:32:26","22.07.2015 9:21:11","Archive","56" |
-Force
Параметр Force — позволяет перезаписать файл с выставленным атрибутом «только на чтение» в тихом режиме.
Пример:
1 2 3 4 5 6 7 8 9 10 |
PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8" Export-Csv : Отказано в доступе по пути "C:\temp\1.csv". строка:1 знак:101 + Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv <<<< 1.csv -Enc oding "UTF8" + CategoryInfo : OpenError: (:) [Export-Csv], UnauthorizedAccessException + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ExportCsvCommand PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8" -Force PS C:\temp> |
-NoClobber
Данный параметр предотвращает перезаписать файла.
1 2 3 4 5 6 7 8 9 10 |
PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv PS C:\temp> Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -NoClobber Export-Csv : Файл "C:\temp\1.csv" уже существует. строка:1 знак:101 + Get-ChildItem 1.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv <<<< 1.csv -No Clobber + CategoryInfo : ResourceExists: (C:\temp\1.csv:String) [Export-Csv], IOException + FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.ExportCsvCommand PS C:\temp> |
-Confirm
Ещё один способ избежать перезаписи, ручной конроль данной операции «-Confirm». Если указать параметр Confirm, то при выполнении команды будет выведен запрос на подтверждение выполнения команды.
Пример:
1 2 3 4 5 6 7 8 |
PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Confirm Подтверждение Вы действительно хотите выполнить это действие? Выполнение операции "Export-Csv" над целевым объектом "1.csv". [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"):Y PS C:\temp> |
-NoTypeInformation
Убирает из файла строчку с данныйми о типах
После выполнения данной команды:
1 |
PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -NoTypeInformation |
Получается вот такой файл:
1 2 3 4 |
"FullName","CreationTime","LastWriteTime","Attributes","Length" "C:\temp\1.txt","21.07.2015 12:37:21","21.07.2015 12:39:14","Archive","117" "C:\temp\2.txt","21.07.2015 13:52:47","22.07.2015 9:14:34","Archive","46" "C:\temp\3.txt","21.07.2015 16:32:26","22.07.2015 9:21:11","Archive","56" |
Первой строчки «#TYPE Selected.System.IO.FileInfo» нет.
-Delimiter «Разделитель столбцов»
Этим параметром можно переназначить разделитель на любой символ. По умолчанию разделителем является «,»(запятая).
Пример:
1 |
Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Delimiter ";" |
В результате получится следующий файл:
1 2 3 4 5 6 |
#TYPE Selected.System.IO.FileInfo "FullName";"CreationTime";"LastWriteTime";"Attributes";"Length" "C:\temp\1.csv";"22.07.2015 10:54:38";"22.07.2015 15:13:29";"Archive";"0" "C:\temp\1.txt";"21.07.2015 12:37:21";"21.07.2015 12:39:14";"Archive";"117" "C:\temp\2.txt";"21.07.2015 13:52:47";"22.07.2015 9:14:34";"Archive";"46" "C:\temp\3.txt";"21.07.2015 16:32:26";"22.07.2015 9:21:11";"Archive";"56" |
-UseCulture
Использовать разделитель исходя из языковых настроек операционной системы. Узнать, что будет использоваться в данной консоли, можно выполнив команду :
1 |
(Get-Culture).TextInfo.ListSeparator |
Пример использования:
1 |
PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -UseCulture |
При моих настройках компьютера:
1 2 3 |
LCID Name DisplayName ---- ---- ----------- 1049 ru-RU Русский (Россия) |
Разделителем является «;».
И соответсвенно получился вот такой файл:
1 2 3 4 5 |
#TYPE Selected.System.IO.FileInfo "FullName";"CreationTime";"LastWriteTime";"Attributes";"Length" "C:\temp\1.txt";"21.07.2015 12:37:21";"21.07.2015 12:39:14";"Archive";"117" "C:\temp\2.txt";"21.07.2015 13:52:47";"22.07.2015 9:14:34";"Archive";"46" "C:\temp\3.txt";"21.07.2015 16:32:26";"22.07.2015 9:21:11";"Archive";"56" |
-Encoding «кодировка»
Позволяет задать кодировку конечного файла. Может принимать следующие значения «Unicode», «UTF7», «UTF8», «ASCII», «UTF32», «BigEndianUnicode», «OEM».
По умолчанию используется «ASCII»
Пример:
1 |
Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8" |
-InputObject «переменная»
Позволяет передавать в командлет переменную для экспорта её в файл. При этом экспортироваться будут свойства переменной, но не её содержимое.
Пример:
1 2 |
PS C:\temp> $d= Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length PS C:\temp> Export-Csv -InputObject $d 2.csv |
Получился вот такой файл.
1 2 3 |
#TYPE System.Object[] "Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized" "3","3","3","1","System.Object[]","False","True","False" |
Import-Csv
Для импорта файлов Csv в переменные, существует командлет Import-csv. При экспорте, а потом импорте объектов с объектом происходит ряд трансформаций.Теряются методы объекта, вместо них появляются методы Equals, GetHashCode, GetType и ToString. Все свойсва объекта конвертируются в их строковые версии.
Так же Import-Csv может Загрузить в объект файл который ни когда не являлся объектом PowerShell.
Рассмотрим параметры данного командлета:
-Path «путь к csv файлу»
Этот параметр задаёт путь к файлу, из которого будут загружаться данные.
Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:\temp> Get-ChildItem *.* | Export-Csv 1.csv PS C:\temp> $a = Import-Csv .\1.csv PS C:\temp> $a|ft PSPath PSParentPat PSChildName PSDrive PSProvider PSIsContain VersionInfo BaseName Mode Name h er ------ ----------- ----------- ------- ---------- ----------- ----------- -------- ---- ---- Microsof... Microsof... 1.csv C Microsof... False File: ... 1 -a--- 1.csv Microsof... Microsof... 1.txt C Microsof... False File: ... 1 -a--- 1.txt Microsof... Microsof... 2.csv C Microsof... False File: ... 2 -a--- 2.csv Microsof... Microsof... 2.txt C Microsof... False File: ... 2 -a--- 2.txt Microsof... Microsof... 3.txt C Microsof... False File: ... 3 -a--- 3.txt Microsof... Microsof... temp.txt C Microsof... False File: ... temp -a--- temp.txt |
Здесь мы сначала экспортировали данные директории в сsv файл, вот такого содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#TYPE System.IO.FileInfo "PSPath","PSParentPath","PSChildName","PSDrive","PSProvider","PSIsContainer","VersionInfo","BaseName","Mode","Name","Length","DirectoryName","Directory","IsReadOnly","Exists","FullName","Extension","CreationTime","CreationTimeUtc","LastAccessTime","LastAccessTimeUtc","LastWriteTime","LastWriteTimeUtc","Attributes" "Microsoft.PowerShell.Core\FileSystem::C:\temp\1.csv","Microsoft.PowerShell.Core\FileSystem::C:\temp","1.csv","C","Microsoft.PowerShell.Core\FileSystem","False","File: C:\temp\1.csv InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: ","1","-a---","1.csv","0","C:\temp","C:\temp","False","True","C:\temp\1.csv",".csv","22.07.2015 10:54:38","22.07.2015 4:54:38","22.07.2015 10:54:38","22.07.2015 4:54:38","29.07.2015 13:27:56","29.07.2015 7:27:56","Archive" "Microsoft.PowerShell.Core\FileSystem::C:\temp\1.txt","Microsoft.PowerShell.Core\FileSystem::C:\temp","1.txt","C","Microsoft.PowerShell.Core\FileSystem","False","File: C:\temp\1.txt InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: ","1","-a---","1.txt","117","C:\temp","C:\temp","False","True","C:\temp\1.txt",".txt","21.07.2015 12:37:21","21.07.2015 6:37:21","21.07.2015 12:37:21","21.07.2015 6:37:21","21.07.2015 12:39:14","21.07.2015 6:39:14","Archive" |
и т.д.
далее импортировали его в переменную $a
при выводе переменной $a мы увидели свойства дирректории…
Посмотрим на эту переменную внимательней:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
PS C:\temp> $a | gm -force TypeName: CSV:System.IO.FileInfo Name MemberType Definition ---- ---------- ---------- pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, mscorlib, Version=2.0.0.0... psadapted MemberSet psadapted {ToString, Equals, GetHashCode, GetType} psbase MemberSet psbase {ToString, Equals, GetHashCode, GetType} psextended MemberSet psextended {PSPath, PSParentPath, PSChildName, PSDrive, PSProvider, PSIsContainer, Ve... psobject MemberSet psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, g... Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() Attributes NoteProperty System.String Attributes=Archive BaseName NoteProperty System.String BaseName=1 CreationTime NoteProperty System.String CreationTime=22.07.2015 10:54:38 CreationTimeUtc NoteProperty System.String CreationTimeUtc=22.07.2015 4:54:38 Directory NoteProperty System.String Directory=C:\temp DirectoryName NoteProperty System.String DirectoryName=C:\temp Exists NoteProperty System.String Exists=True Extension NoteProperty System.String Extension=.csv FullName NoteProperty System.String FullName=C:\temp\1.csv IsReadOnly NoteProperty System.String IsReadOnly=False LastAccessTime NoteProperty System.String LastAccessTime=22.07.2015 10:54:38 LastAccessTimeUtc NoteProperty System.String LastAccessTimeUtc=22.07.2015 4:54:38 LastWriteTime NoteProperty System.String LastWriteTime=29.07.2015 13:27:56 LastWriteTimeUtc NoteProperty System.String LastWriteTimeUtc=29.07.2015 7:27:56 Length NoteProperty System.String Length=0 Mode NoteProperty System.String Mode=-a--- Name NoteProperty System.String Name=1.csv PSChildName NoteProperty System.String PSChildName=1.csv PSDrive NoteProperty System.String PSDrive=C PSIsContainer NoteProperty System.String PSIsContainer=False PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\1.csv PSProvider NoteProperty System.String PSProvider=Microsoft.PowerShell.Core\FileSystem VersionInfo NoteProperty System.String VersionInfo=File: C:\temp\1.csv... |
Мы увидем, что свойства этой переменной имеют тип System.String, а так же у нас отсутствуют методы :
Свойственные типу System.IO.FileInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
PS C:\temp> dir *.* | gm -MemberType Method TypeName: System.IO.FileInfo Name MemberType Definition ---- ---------- ---------- AppendText Method System.IO.StreamWriter AppendText() CopyTo Method System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(strin... Create Method System.IO.FileStream Create() CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType) CreateText Method System.IO.StreamWriter CreateText() Decrypt Method System.Void Decrypt() Delete Method System.Void Delete() Encrypt Method System.Void Encrypt() Equals Method bool Equals(System.Object obj) GetAccessControl Method System.Security.AccessControl.FileSecurity GetAccessControl(), System.Security.... GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetObjectData Method System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo info, ... GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() MoveTo Method System.Void MoveTo(string destFileName) Open Method System.IO.FileStream Open(System.IO.FileMode mode), System.IO.FileStream Open(S... OpenRead Method System.IO.FileStream OpenRead() OpenText Method System.IO.StreamReader OpenText() OpenWrite Method System.IO.FileStream OpenWrite() Refresh Method System.Void Refresh() Replace Method System.IO.FileInfo Replace(string destinationFileName, string destinationBackup... SetAccessControl Method System.Void SetAccessControl(System.Security.AccessControl.FileSecurity fileSec... ToString Method string ToString() |
-Header «Заголовок»
У файла который мы будем импортировать можно добавить заголовок параметром Header
Попытаемся импортировать файл 1.csv с изменённым заголовком:
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:\temp> $a = Import-Csv .\1.csv -Header 'Path','-','Name','Disk' PS C:\temp> $a Path - Name Disk ---- - --- ---- PSPath PSParentPath PSChildName PSDrive Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.csv C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.csv C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 3.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... temp.txt C |
Заметим, что свойства на которых не хватило именования не вошли в переменную $a, если бы в шапке оказалось бы больше именований столбцов, чем свойств в файле. То свойстива с этими именами остались бы пустыми.
В основном она не нужна и поэтому убирается либо в файле перед импортом, либо из объектов после:
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\temp> $a = $a |Where-Object {$_.Disk -ne "PSDrive"} PS C:\temp> $a Path - Name Disk ---- - ---- ---- Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.csv C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 1.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.csv C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 2.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... 3.txt C Microsoft.PowerShell.Core\... Microsoft.PowerShell.Core\... temp.txt C |
Как и у Export-CSV у Import-Csv есть параметры отвечающие за разделители:
-Delimiter «Символ разделитель»
Можно указать какой разделитель используется у исходного файла.
Как пример:
1 |
$a = Import-Csv 1.csv -Delimiter "," |
-UseCulture
Использовать в качестве разделителя символ соответствующий настройкам текущего компьютера
Пример:
1 |
$a = Import-Csv 1.csv -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-представление объекта.
Пример:
1 |
PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv |
-Encoding
Задает кодировку целевого файла. Допустимые значения: ASCII, UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, Default и OEM. По умолчанию используется значение UTF8.
Пример:
1 |
PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Encoding "ASCII" |
-InputObject
Задает объект, подлежащий преобразованию. Введите переменную, содержащую объекты, либо команду или выражение для получения объектов. Кроме того, можно передать объекты командлету Export-Clixml по конвейеру.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
PS C:\Temp> Export-Clixml -Path 1.xml -InputObject $a PS C:\Temp> $a= Import-Clixml .\1.xml PS C:\Temp> $a Каталог: C:\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 31.07.2015 16:07 12022 1.csv -a--- 31.07.2015 15:29 7 1.txt -a--- 31.07.2015 15:29 7 1.xml -a--- 31.07.2015 15:29 7 2.csv -a--- 31.07.2015 15:29 7 2.txt -a--- 31.07.2015 15:29 7 2.xml -a--- 31.07.2015 15:29 7 212.txt -a--- 31.07.2015 15:29 7 22.txt -a--- 31.07.2015 15:29 7 3.txt -a--- 31.07.2015 15:29 7 3.xml -a--- 31.07.2015 15:37 42 4.txt -a--- 31.07.2015 15:42 14 5.csv -a--- 31.07.2015 15:39 84 5.txt -a--- 31.07.2015 15:52 42 6.doc -a--- 31.07.2015 15:51 21 6.oth -a--- 31.07.2015 15:47 28 6.txt -a--- 31.07.2015 15:29 7 temp.txt |
-Force
Указывает командлету снять для файла вывода атрибут «только чтение», если это необходимо. Когда выполнение команды завершится, командлет попытается заново установить атрибут «только чтение».
1 |
PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Force |
-NoClobber
Не позволяет командлету перезаписать содержимое существующего файла. По умолчанию если файл существует по указанному пути, командлет Export-Clixml перезаписывает файл без предупреждения.
Пример ошибки, если файл уже существует:
1 2 3 4 5 6 |
PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -NoClobber Export-Csv : Файл "C:\Temp\1.csv" уже существует. строка:1 знак:31 + Get-ChildItem *.* | Export-Csv <<<< -Path 1.csv -NoClobber + CategoryInfo : ResourceExists: (C:\Temp\1.csv:String) [Export-Csv], IOException + FullyQualifiedErrorId : NoClobber,Microsoft.PowerShell.Commands.ExportCsvCommand |
-Confirm
Запрашивает подтверждение перед выполнением команды.
1 2 3 4 5 6 7 8 |
PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Confirm Подтверждение Вы действительно хотите выполнить это действие? Выполнение операции "Export-Csv" над целевым объектом "1.csv". [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "Y"):y PS C:\Temp> |
Новый параметр один и называется :
-Depth «число уровня вложенности»
Рассмотрим пример:
1 2 |
PS C:\temp> Get-ChildItem C:\Windows\System32\Speech\SpeechUX | Export-Clixml 3.xml -Depth 3 PS C:\temp> $d = Import-Clixml 3.xml |
Сделаем импор-экспорт дирректории с 3 уровнем вложенности и сохраним в переменную $d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PS C:\temp> $d Каталог: C:\Windows\System32\Speech\SpeechUX Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 12.04.2011 19:26 ru-RU -a--- 14.07.2009 7:38 243200 sapi.cpl -a--- 21.11.2010 9:24 1126912 SpeechUX.dll -a--- 21.11.2010 9:24 418304 speechuxcpl.dll -a--- 14.07.2009 7:41 40448 SpeechUXPS.DLL -a--- 14.07.2009 7:39 4942848 SpeechUXTutorial.exe -a--- 14.07.2009 7:39 628224 SpeechUXWiz.exe -a--- 14.07.2009 7:41 152064 SPTIP.DLL |
При этом $d[0] это у нас каталог ru-RU
1 2 3 4 5 6 7 8 9 |
PS C:\temp> $d[0] Каталог: C:\Windows\System32\Speech\SpeechUX Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 12.04.2011 19:26 ru-RU |
Посмотрим родительские каталоги его родительских каталогов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PS C:\temp> $d[0].parent Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 12.04.2011 19:26 SpeechUX PS C:\temp> $d[0].parent.parent Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 14.07.2009 11:32 Speech PS C:\temp> $d[0].parent.parent.parent System32 |
При этом родительский каталог, родительского каталога имеет тип Deserialized.System.IO.DirectoryInfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
PS C:\temp> $d[0].parent.parent|gm TypeName: Deserialized.System.IO.DirectoryInfo Name MemberType Definition ---- ---------- ---------- ToString Method string ToString(), string ToString(string format, System.IFormatProvider formatProvider) BaseName NoteProperty System.String BaseName=Speech Mode NoteProperty System.String Mode=d---- Attributes Property System.String {get;set;} CreationTime Property System.DateTime {get;set;} CreationTimeUtc Property System.DateTime {get;set;} Exists Property System.Boolean {get;set;} Extension Property System.String {get;set;} FullName Property System.String {get;set;} LastAccessTime Property System.DateTime {get;set;} LastAccessTimeUtc Property System.DateTime {get;set;} LastWriteTime Property System.DateTime {get;set;} LastWriteTimeUtc Property System.DateTime {get;set;} Name Property System.String {get;set;} Parent Property System.String {get;set;} Root Property System.String {get;set;} |
А его родительский каталог является уже System.String:
1 2 3 4 5 6 7 8 9 |
PS C:\temp> $d[0].parent.parent.parent|gm TypeName: System.String Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone() CompareTo Method int CompareTo(System.Object value), int CompareTo(string strB) |
Комментарии: