Скрипты — Клёвый код https://coolcode.ru Скриптописание и кодинг Wed, 22 Aug 2018 12:10:14 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.8.13 https://coolcode.ru/wp-content/uploads/2015/10/YO1-150x150.png Скрипты — Клёвый код https://coolcode.ru 32 32 PowerShell. Парсинг сайта или забрать значение с сайта. https://coolcode.ru/powershell-parsing-sayta-ili-zabrat-znachenie-s-sayta/ https://coolcode.ru/powershell-parsing-sayta-ili-zabrat-znachenie-s-sayta/#comments Mon, 18 Apr 2016 10:25:46 +0000 http://coolcode.ru/?p=8087

Иногда при выполнении скрипта приходится опираться на значения с web сайтов. В PowerShell с версии 3.0 для этого имеется замечательный командлет Invoke-WebRequest.

Рассмотрим подробнее скрипт:

!!!В строчке $trash = $li.innerhtml -match " \ ( ( . * ? ) \ ) " убрать пробелы внутри ковычек » \ ( ( . * ? ) \ ) «.!!!

$ie = Invoke-WebRequest -Uri 'http://coolcode.ru' -Method POST -ContentType "text/plain; charset=utf-8"
$li=$ie.AllElements |where {($_.tagName -eq "LI") -and ($_.innerhtml -like "*Администрирование*")}
$trash = $li.innerhtml -match " \ ( (.*?) \ ) "
$Matches[1]

Этот скрипт выполняет следующие действие: на сайте «http://coolcode.ru» мы находим рубрику «Администрирование» и смотрим сколько в данной рубрике статей.

В начале мы создаём объект, со страницей сайта:

$ie = Invoke-WebRequest -Uri 'http://coolcode.ru' -Method Get -ContentType "text/plain; charset=utf-8"

Здесь используется самая главный командлет Invoke-WebRequest

В данном примере мы используем только необходимые параметры:

-Uri <String>

Командлет Invoke-WebRequest поддерживает следущие протоколы: HTTP, HTTPS, FTP, и FILE.  В данном параметре необходимо указать url к странице, в нашем случае это http://coolcode.ru’.

-Method <WebRequestMethod>

Определяет метод используемый для веб-запроса. Допустимые значения: Default, Delete, Get, Head, Merge, Options, Patch, Post, Put и Trace.

Пробежимся в крации по ним:

Head Получение заголовка, без тела. В основном используется для получения матаданных.

Get Применяется для получения содержимого указанного ресурса.

Options Применяется для определения возможностей веб-сервера или параметров соединения.

Post Используется для передачи данных на сервер.

Put Загрузка содержимого на указанный uri.

Patch Тоже самое, что и Put но только применяется на фрагмент ресурса

Delete Удаляет указанный ресурс.

Тrace Возвращает полученный запрос, с информацией о добавлении и изменении запроса промежуточными серверами.

Merge

В своём примере я использую значение POST. Хоть мне надо всего лишь получить данные из тела страницы и в первой редакции этой статьи я использовал метод GET, но с методом GET как то через раз отрабатывал параметр -contentType.

 -ContentType <String>

Задаёт тип содержимого в веб-запросе. по умолчанию «application/x-www-form-urlencoded». Я использую данный метод, для получения данных в правильной кодировке :-ContentType «text/plain; charset=utf-8». У меня почему то этот параметр через раз работал с «-Method GET», после изменения на «-Method POST» всё работает корректно.

У командлета Invoke-WebRequest существуют так же ещё много интересных параметров, которые могут быть вам интересны:

-Body<Object>

Данный параметр задаёт тело запроса, и используется для заполнения полей на сайте. (этот параметр  рассмотрим в другой статье)

-Certificate<X509Certificate>

Задаёт сертификат, для реализации безопасности в веб-запросе. Что бы найти сертификат воспользуйтесь командлетом Get-PfxCertificate или используйте Get-ChieldItem на диске Cert:. Если сертификат не действительный или не имеет достаточных полномочий, команда не выполнится.

-CertificateThumbprint<String>

Задаёт учётную запись пользователя, который имеет право на отправку запроса на цифровой сертификат открытого ключа (X509).

-Credential<PSCredential>

Задаёт учётную запись пользователя, который имеет разрешение на отправку запроса. По умолчанию используется текущий пользователь.

-DisableKeepAlive

Устанавливает значение постоянного HTTP соединения в HTTP-заголовке в значение False. По умолчанию постоянное HTTP соединение включено.

-Headers<IDictionary>

Устанавливает заголовок веб-запроса. Можно указать хэш-таблицу или словарь.

-InFile<String>

Получение содержимого веб-запроса из файла.

Определяет, сколько раз Windows PowerShell может совершить попыток для соединение с заданным URI, прежде чем возникнет ошибка подключения. По умолчанию значение 5. Значение 0 блокирует все попытки.

-OutFile<String>

Сохраняет тело ответа в указанный файл.

-PassThru

Возвращает результаты в консоль, в дополнении к записи результатов в файл. Используется вместе с параметром -OutFile

-Proxy<Uri>

Задаёт прокси сервер для выполнения запроса.

-ProxyCredential<PSCredential>

Параметры учётной записи для прокси. Например «User01» или «Domain01\User01».

-ProxyUseDefaultCredentials

Для соединением с прокси использовать учётные данные текущего пользователя.

-SessionVariable<String>

Создаёт сеанс веб-запроса в и сохраняет его в значение указанной переменной. Переменную необходимо вводить без знака доллара «$». При указании переменной сеанса, Invoke-WebRequest создаёт объект сеанса веб-запроса и присваивает его переменной с указанным именем. Вы сможете использовать данную переменную, как только закончится выполнение запроса. Данный объект не является постоянным соединением. Он содержит информацию о связи запроса, кукисы, учётные данные, максимальные значения количества соединений и строки агента пользователя. Этот объект можно использовать для обмена состояниями данных, между веб-запросами.

-TimeoutSec<Int32>

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

-TransferEncoding<String>

Определяет значение зжатия для заголовка HTTP. Допустимы значения Chunked, Compress, Deflate, GZip и Identity.

-UseBasicParsing

Использование объекта ответа для HTML без синтаксического анализа DOM.

-UseDefaultCredentials

Использование учётных данных текущего пользователя, для отправки веб-запроса.

-UserAgent<String>

Использовать строку для аутентификации сайтом агента. По умолчанию используется «Mozilla/5.0 (Windows NT; Windows NT 6.1; en-US) WindowsPowerShell/3.0».

-WebSession<WebRequestSession>

Назначает сеанс веб-запроса.  Переменная указывается со знаком доллора($).

Что бы изменить значение параметров в сеансе веб, используйте параметры командлета, например UserAgent или Credential. Параметры командлета имеют больший приоритет, чем значчения в сессии веб-запроса.

В полученной переменной будет содержаться информация о

 

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

$ie = Invoke-WebRequest -Uri 'http://coolcode.ru' -Method Get -ContentType "text/plain; charset=utf-8"

У будет объект, содержащий данные страницы http://coolcode.ru, но это не просто текст, а как и всё в PowerShell это объект. И у него есть очень интересные свойства:

PS C:\Windows\system32> $ie|Get-Member


   TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

Name              MemberType Definition                                                                 
----              ---------- ----------                                                                 
Equals            Method     bool Equals(System.Object obj)                                             
GetHashCode       Method     int GetHashCode()                                                          
GetType           Method     type GetType()                                                             
ToString          Method     string ToString()                                                          
AllElements       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;}
BaseResponse      Property   System.Net.WebResponse BaseResponse {get;set;}                             
Content           Property   string Content {get;}                                                      
Forms             Property   Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;}            
Headers           Property   System.Collections.Generic.Dictionary[string,string] Headers {get;}        
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}     
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}      
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}                                    
RawContent        Property   string RawContent {get;}                                                   
RawContentLength  Property   long RawContentLength {get;}                                               
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}                             
Scripts           Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}    
StatusCode        Property   int StatusCode {get;}                                                      
StatusDescription Property   string StatusDescription {get;}

Рассмотрим их:

AllElements — Возвращает массив свойств всех элементов.
Forms — Возвращает массив свойств всех форм.
Images — Возвращает массив всех свойств изображений.
InputFields — Возвращает массив всех свойств полей воода.
Links — Возвращает массив свойств ссылок.
ParsedHtml — Возвращает странцу ввиде дерева объектов.
Scripts — Возвращает массив свойств всех скриптов.

Content — Возвращает содержимое страницы.

 

И переходим к следующей строчке скрипта:

$li=$ie.AllElements |where {($_.tagName -eq "LI") -and ($_.innerhtml -like "*Администрирование*")}

 

$li=$ie.AllElements

В моём случае я использую свойство AllElements объекта $ie . И у меня получится массив элементов страницы … каждый элемент будет являтся объектов со следующими свойствами:

$ie.AllElements |Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
innerHTML   NoteProperty  innerHTML=null               
innerText   NoteProperty  innerText=null               
outerHTML   NoteProperty  outerHTML=null               
outerText   NoteProperty  outerText=null               
tagName     NoteProperty System.String tagName=!

Рассмотрим его свойства:

tagName — имя элемента (div,li,p,a…)
innerHTML — HTML код внутри тэга.
innerText — Отображаемый код из тега.
outerHTML  — Код всего тэга.
outerText — текс который отображается из этого тэга.

 

В нашем примере я использую  свойства tagName и innerHTML которые должны равнятся соответствующим значениям:

where {($_.tagName -eq "LI") -and ($_.innerhtml -like "*Администрирование*")}

как я узнал каким значениям должны ровняться данные параметры?

Я посмотрел код страницы. В Chrome и Firefox например, можно выделить интересующий вас участок и нажав правую кнопку выбрать в выпадающем списке кнопку звучащую примерно, как «Просмотреть код».

Но вернёмся к скрипту. После отработки строчки:

$li=$ie.AllElements |where {($_.tagName -eq "LI") -and ($_.innerhtml -like "*Администрирование*")}

в переменной $li у нас будет содержаться код тэга li с кодом внутри содержащим слово «Администрирование».

Теперь из него осталось достать нужную нам информацию… а конкретно значение в скобках. Я предлагаю воспользоваться регулярным выражением:

!!!В строчке $trash = $li.innerhtml -match " \ ( ( . * ? ) \ ) " убрать пробелы внутри ковычек » \ ( ( . * ? ) \ ) «.!!!

$trash = $li.innerhtml -match " \ ( ( . * ? ) \ ) "
$Matches[1]

Нужное нам значение получено.

]]>
https://coolcode.ru/powershell-parsing-sayta-ili-zabrat-znachenie-s-sayta/feed/ 6
Бот на AutoIt, обработка изображения. https://coolcode.ru/bot-na-autoit-obrabotka-izobrazheniya/ https://coolcode.ru/bot-na-autoit-obrabotka-izobrazheniya/#respond Fri, 15 Jan 2016 09:01:36 +0000 http://coolcode.ru/?p=169

Бот AutoIt на примере флэш игры «Present Stacker».

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

К сожалению данный макрос имеет придел, он не успевает захватить пиксель проанализировать и тыкнуть на подарок. В результате коробка падает мимо… максимальный счёт, который у меня удалось набрать 21400 …

Dim $X=960
Dim $Y=260
Dim $temp
MouseMove(960,265)
While 1
$checksum = PixelGetColor ( $X , $Y )
$Temp=Floor($checksum/0x10000)

if $temp>2*Mod($checksum,0x100) And
$temp>2*Floor(Mod($checksum,0x10000)/0x100) Then
MouseClick("left")
EndIf
WEnd

 

]]>
https://coolcode.ru/bot-na-autoit-obrabotka-izobrazheniya/feed/ 0
Autoit. Взаимодействие с сайтом. https://coolcode.ru/autoit-vzaimodeystvie-s-saytom/ https://coolcode.ru/autoit-vzaimodeystvie-s-saytom/#comments Tue, 29 Dec 2015 08:59:39 +0000 http://coolcode.ru/?p=5442

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

Здесь, рассмотрим, как взаимодействовать с сайтом, с помощью Autoit.

Задача следующая, ввести в поле поиска сайта coolcode.ru число 12 и нажать кнопку поиска.

У меня получился вот такой код:

#include <IE.au3>
#include <StringConstants.au3>
Global $Num="12"

Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "search")

Local $oInput = _IEGetObjById($oDiv, "s")
_IEAction($oInput, "focus")
Sleep(1000)
_IEFormElementSetValue($oInput,$Num)

Local $oInput = _IEGetObjById($oDiv, "s")
Sleep(1000)
Local $oButton=_IEGetObjById($oDiv, "searchsubmit")
_IEAction($oButton, "focus")
Sleep(1000)
_IEAction($oButton, "click")


;_IEQuit($oIE)

Воспользуемся модулем:

#include <IE.au3>

В предыдущей статье у нас появилась переменная

Global $Num="12"

Уже знакомыми командами открываем IE с сайтом coolcode.ru

Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)

Теперь ищем <div> с id «search»

Local $oDiv = _IEGetObjById($oIE, "search")

 

После выполнения команды в переменной $oDiv Будет находится следующий элемент:

<div id="search">
						<form method="get" id="searchform" action="http://coolcode.ru/">
	<label for="s" class="assistive-text hidden">Поиск</label>
	<input id="s" type="text" name="s" placeholder="Поиск">
	<button id="$Num" name="submit" type="submit">Поиск</button>
</form>					</div>

В этом dive у нас находятся, как поле ввода в которое мы должны ввести 12, так и кнопка, по которой мы должны нажать.

 

Найдём поле ввода

Local $oInput = _IEGetObjById($oDiv, "s")

и кнопку

Local $oButton=_IEGetObjById($oDiv, "searchsubmit")

 

устанавливаем значение поля ввода такое же как и содержание переменной $Num

_IEAction($oInput, "focus")
Sleep(1000)
_IEFormElementSetValue($oInput,$Num)

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

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

 

И последнее нажимаем на кнопку

_IEAction($oButton, "focus")
Sleep(1000)
_IEAction($oButton, "click")

Тоже самое сначала фокус, потом задержка, потом нажимаем на кнопку.

И вуаля… сайт послушно ищет 12.

]]>
https://coolcode.ru/autoit-vzaimodeystvie-s-saytom/feed/ 19
Autoit. Парсинг сайта или забрать значение с сайта. https://coolcode.ru/autoit-parsing-sayta-ili-zabrat-znachenies-sayta/ https://coolcode.ru/autoit-parsing-sayta-ili-zabrat-znachenies-sayta/#comments Tue, 29 Dec 2015 07:50:47 +0000 http://coolcode.ru/?p=5416

 

Парсить чужие сайты — это нудный и не благодарный труд. Обычно для этого продвинутые спамеры и ботоводы используют специальный софт. Например, когда это понадобилось мне я пользовался программой ZennoPoster. Для профессионального использования придётся покупать лицензию. Но для небольших задач, доступна демо версия которая позволяет в процессе тестирования делать небольшие проекты и запускать их, и доступно какой-то период штука для автоматического запуска проектов. Очень много визуального программирования и доступны вставки на языке например C#.

Но если парсить сайты — это лишь небольшая часть скрипта, то можно попытаться обойтись AutoIt.

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

— Скрипт должен выполнятся с правами администратора.

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

— Работе скрипта так же может мешать UAC (отключение может помочь)

!!!В 9 строчке (Local $aArray = StringRegExp($oLiHtml,‘( (.*?))’,1)),  в конструкции ‘ \ ((.*?) \ )’ убираем пробелы !!!!

#include <IE.au3>
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)
Sleep(2000)
Local $oDiv = _IEGetObjById($oIE, "categories-3")
Local $oLis = _IETagNameGetCollection($oDiv, "li")
For $oLi In $oLis
 If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',1)
  Global $Num=$aArray[0]
 EndIf
next
MsgBox(0,"",$Num);
_IEQuit($oIE)

И так рассмотрим проект который на сайте CoolCode.Ru пытается посмотреть сколько статей в разделе  Администрирование.

Воспользуемся модулем:

#include <IE.au3>

 

Запускаем IE с нашим сайтом:

Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1)

Параметры по порядку:

«http://www.coolcode.ru» — соответственно url страницы

0 — мы не пытаемся открыть новую вкладку.

1- окно видимо

0 — мы не ожидаем конца загрузки страницы(реклама и социальные кнопки… да ну их)

1 — с делать это окно в фокусе

 

Ждём 2 секунды

Sleep(2000)

это скользкий путь если не важно время выполнения скрипта, то лучше на предыдущей строчке в ожидании конца загрузки поставить 1. Так же для ускорения можно сделать небольшой тюнинг самого IE установить там ADBlock(не забываем выключать на моём сайте, что бы кликать рекламу :)), отключить картинки, убрать CSV, и прочее.

 

Дальше мы из объекта $oIE выцыпляем объект с id = «categories-3»

Local $oDiv = _IEGetObjById($oIE, "categories-3")

Для того, что бы посмотреть код объекта смотрим html страницы, а лучше самого объекта, для этого рекомендую Firefox. Хотя мне хватило Chrome.

Вообще в Autoit нету выцыпления по классу в базовом наборе … прям беда. 🙁

 

И того у нас в объекте $oDiv содержиться примерно такая беда:

Если бы у нас была такая команда

ConsoleWrite($oDiv.Outerhtml)

, то в консоли выдался бы такой текст:

<div class="widget clearfix widget_categories" id="categories-3"><h3 class="heading">Рубрики</h3>		<ul>
	<li class="cat-item cat-item-9"><a href="http://coolcode.ru/admin/">Администрирование</a> (12)
<ul class="children">
	<li class="cat-item cat-item-6"><a href="http://coolcode.ru/admin/scripts/">Скрипты</a> (9)
</li>
</ul>
</li>
	<li class="cat-item cat-item-1"><a href="http://coolcode.ru/bez-rubriki/">Без рубрики</a> (2)
</li>
	<li class="cat-item cat-item-27"><a href="http://coolcode.ru/novosti/">Новости</a> (2)
</li>
	<li class="cat-item cat-item-31"><a href="http://coolcode.ru/reshenie-zadach/">Проверка знаний</a> (862)
</li>
	<li class="cat-item cat-item-24"><a href="http://coolcode.ru/proektyi/">Проекты</a> (1)
</li>
	<li class="cat-item cat-item-21"><a href="http://coolcode.ru/tsiklyi-statey/">Циклы статей.</a> (1)
</li>
	<li class="cat-item cat-item-11"><a href="http://coolcode.ru/programming_languages/">Языки программирования</a> (21)
<ul class="children">
	<li class="cat-item cat-item-12"><a href="http://coolcode.ru/programming_languages/training/">Обучение</a> (17)
	<ul class="children">
	<li class="cat-item cat-item-19"><a href="http://coolcode.ru/programming_languages/training/spravochnaya-informatsiya/">Справочная информация</a> (15)
</li>
	</ul>
</li>
</ul>
</li>
		</ul>
</div>

 

Здесь мы видим список <li> объектов, делаем коллекцию $oLis.

Local $oLis = _IETagNameGetCollection($oDiv, "li")

Бежим по получившейся коллекции:

For $oLi In $oLis
...
next

 

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

!!!В 3 строчке (Local $aArray = StringRegExp($oLiHtml,‘( (.*?))’,1)),  в конструкции ‘ \ ((.*?) \ )’ убираем пробелы !!!!

If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then
  Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',2)
 EndIf

В принципе, если вы профессионал в регулярных выражениях, вы бы могли сразу воспользоваться функцией: _INetGetSource из модуля  Inet.au3 и просто парсить код страницы. Предыдущие манипуляции просто упрощают задачу.

Итак, я немного отвлёкся. В коде мы бежим по li объектам если мы видим что в этом объекте содержится текст Администрирование, то объект правильный.

If StringInStr ($oLi.innerhtml,"Администрирование")>0 Then

Сохраняем его в переменную $oLiHtml значение свойства innerhtml:

Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")

То-есть код внутри тега.

 

Дальше используем поиск всех значений в скобачках и помещаем их в массив $aArray

!!!Строчка (Local $aArray = StringRegExp($oLiHtml,‘( (.*?))’,1)), пишется без пробелов в конструкции ‘ \ ((.*?) \ )’!!!!

Local $aArray = StringRegExp($oLiHtml,' \ ((.*?) \ )',2)

Дальше запихиваем нужное значение в переменную $Num

Global $Num=$aArray[0]

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

 

Далее мы выводим результат на экран и закрываем окно.

MsgBox(0,"",$Num);
_IEQuit($oIE)

На этом парсинг сайта закончен.

Ну и немного модефицировав код, мы можем получить индекс Доу-Джонса с сайта yahoo

#include <IE.au3>
Local $oIE = _IECreate("https://beta.finance.yahoo.com/quote/%5EDJI/news",0,0,1,1)
;Sleep(10000)
Local $oLis = _IETagNameGetCollection($oIE, "span")
For $oLi In $oLis
 If StringInStr ($oLi.outerhtml,'class="quote-price"')>0 Then
   Local $oLiHtml=_IEPropertyGet($oLi,"innerhtml")
  Global $Num=$oLiHtml
 EndIf
next
_IEQuit($oIE)
MsgBox(0,"",$Num);

Статья про взаимодействием сайта и AutoIt

Спасибо Юрию за комментарий, о устранении возможных ошибок.

]]>
https://coolcode.ru/autoit-parsing-sayta-ili-zabrat-znachenies-sayta/feed/ 11
Поиск групп по шаблону с консоли. Power Shell https://coolcode.ru/poisk-grupp-po-shablonu-s-konsoli-power-shell/ https://coolcode.ru/poisk-grupp-po-shablonu-s-konsoli-power-shell/#respond Sat, 19 Sep 2015 03:53:15 +0000 http://coolcode.ru/?p=3582

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

Суть такова, я подключаюсь к серверу, на котором установлен модуль ActiveDirectory. и в цикле запрашиваю с консоли ввод шаблона и выдаю результаты по нему.

$domainController = "AD1.test.local"

invoke-command -computername $domainController -scriptblock { Import-Module ActiveDirectory; $str=""; While ($str -ne "exit") {if ($str -ne "" ){get-adgroup -filter 'SamAccountName -like $str' |ft DistinguishedName}; $str = Read-Host  "Введите шаблон группы";}}

Немного описания данного скрипта:

$domainController = "AD1.test.local"

Здесь задаётся имя сервера с установленным модулем ActiveDirectory. В моём случае это сервер «AD1» в домене «test.local». (что уж там таить контроллер домена).

invoke-command -computername $domainController -scriptblock {..}

Подключаемся к серверу и выполняем на нём scriptblock который находится в фигурных скобочках : {}

А скрипт вот такой:

Import-Module ActiveDirectory;
$str="";
While ($str -ne "exit") {
 if ($str -ne "" ){
   get-adgroup -filter 'SamAccountName -like $str' |ft DistinguishedName
 }; 

   $str = Read-Host  "Введите шаблон группы";
 }

 

Import-Module ActiveDirectory;

Загружаем модуль Active Directory;

$str="";

Объявляем пустую текстовую переменную.

While ($str -ne "exit") {...}

Дальше запускаем цикл он будет идти, пока переменная $str не будет равняться  «exit» (тк. эта переменная будет брать значение из консоли то если написать в консоли слово exit то скрипт завершится)

if ($str -ne "" ){...}

Если строка не пустая, то пытаемся найти группу

get-adgroup -filter 'SamAccountName -like $str'

соответственно передаём по контейнеру группы которые удовлетворяют шаблону,

ft DistinguishedName

Выводим табличкой одно поле DistinguishedName получается просто список групп без лишних буковок  в начале,как например при fl.

 

$str = Read-Host  "Введите шаблон группы";

запрашиваем с консоли ввести группу.

]]>
https://coolcode.ru/poisk-grupp-po-shablonu-s-konsoli-power-shell/feed/ 0
Ошибка : Invalid class https://coolcode.ru/oshibka-invalid-class/ https://coolcode.ru/oshibka-invalid-class/#comments Thu, 06 Aug 2015 06:41:09 +0000 http://coolcode.ru/?p=3409

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

PS C:\Users\Users> Get-ExecutionPolicy
Get-ExecutionPolicy : Invalid class
At line:1 char:20
+ Get-ExecutionPolicy <<<<
+ CategoryInfo          : NotSpecified: (:) [Get-ExecutionPolicy],
ManagementException
+ FullyQualifiedErrorId :
System.Management.ManagementException,Microsoft.PowerShell.Commands.GetExecutionPolicyCommand

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

PS C:\> cd C:\Windows\System32\wbem;MOFcomp CIMWIN32.MOF
Microsoft (R) MOF Compiler Version 6.1.7600.16385
Copyright (c) Microsoft Corp. 1997-2006. All rights reserved.
Parsing MOF file: CIMWIN32.MOF
MOF file has been successfully parsed
Storing data in the repository...
Done!
PS C:\Windows\System32\wbem>

 

Но, если у вас проблема таким образом не решилась или возможно у вас они возникли с другими командлетами, можно запустить следующий скрипт, который перерегистрирует все библиотеки WMI.

PowerShell:

Set-Service winmgmt -StartupType Disabled
stop-Service winmgmt -Force
Set-Location $env:windir\system32\wbem
Get-ChildItem *.dll | ForEach-Object {regsvr32 /s $_}
wmiprvse /regserver
Set-Service winmgmt -StartupType Automatic
Start-Service winmgmt
Get-ChildItem *.mof,*.mfl | ForEach-Object {mofcomp $_}
Set-Location $env:windir\system32\wbem\AutoRecover
Get-ChildItem *.mof,*.mfl | ForEach-Object {mofcomp $_}

Тоже самое для командной строки(воз):

sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
wmiprvse /regserver
sc config winmgmt start= auto
net start winmgmt
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s

cd %windir%\system32\wbem\AutoRecover
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s

]]>
https://coolcode.ru/oshibka-invalid-class/feed/ 1
PowerShell. Работа с файлами, импорт и экспорт объектов в текстовые файлы. https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/ https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/#respond Tue, 04 Aug 2015 06:41:18 +0000 http://coolcode.ru/?p=3219

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

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

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

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

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

Пример:

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» текущей директории.

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

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.

Пример:

Get-ChildItem lkdjflds >1.txt 2>&1

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

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. Эти командлеты заменяет все данные в файле на указанные. Перед записью они преобразовывают объекты в строки и не всегда удобны. Зато они могут использоваться для массового изменения файлов. Простейшая их запись выглядит так:

Set-content 1.txt "Hello"

Add-content 1.txt "Hello"

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

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

 

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

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

Пример:

Set-content 1.txt -value "Hello"

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

Ещё пример:

PS C:\Temp> Add-content -Path 1.txt -value "Hello1","Hello2"
PS C:\Temp>

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

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

Set-content 1.txt "Hello"

Add-content -Path 1.txt "Hello1","Hello2"

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

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

Пример:

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 передать переменную:

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 «путь до файла(ов)»

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

PS C:\temp> Set-content -literalPath 1.txt , 2.txt "Hello"

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

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

Add-content -literalPath 1.txt , 2.txt "Hello"

 

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

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

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

Set-content C:\temp\*.txt "Hello"

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

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

Set-content C:\temp\*,C:\temp2\* "Hello"

 

-Force

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

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:

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 «шаблон имени»

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

Пример:

PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Filter "*.txt" -value "Hello2"

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

 

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

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

Пример:

PS C:\temp> Set-content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt"

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

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

PS C:\temp> Add-Content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc","*.txt" -value "33" -Exclude "1.txt"

 

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

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

Пример:

PS C:\temp> Set-content -Path *.txt -Exclude ?.txt "22"

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

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

PS C:\temp> Add-Content -Path *.txt -Exclude ?.txt "22"

 

-PassThru

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

Пример:

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

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

Пример:

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

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

get-childitem | Out-File 2.txt

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

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

 

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

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

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

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

get-childitem | Out-File -FilePath 2.txt

 

-Append

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

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

get-childitem | Out-File -FilePath 2.txt -Append

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

 

-NoClobber

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

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

get-childitem | Out-File -FilePath 2.txt -NoClobber

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

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

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

get-childitem | Out-File -FilePath 2.txt -NoClobber -Append

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

 

-Confirm

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

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

get-childitem | Out-File -FilePath 2.txt -Confirm

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

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Вывод в файл" над целевым объектом "2.txt".
[Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка
(значением по умолчанию является "Y"):

 

-Force

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

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

get-childitem 234234f 2>&1 | Out-file 2.txt -force

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

PowershellAndFiles3

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

 

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

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

Пример:

get-childitem 234234f 2>&1 | Out-file 2.txt -Encoding "ASCII"

 

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

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

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

$a1 = 1,2,3

$a2 = $a1,$a1,$a1

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

$a2|Out-File 2.txt; $a2

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

1
2
3
1
2
3
1
2
3

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

Out-File -InputObject $a2 2.txt;$a2

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

1
2
3
1
2
3
1
2
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

Length         : 3
LongLength     : 3
Rank           : 1
SyncRoot       : {1, 2, 3}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 3

 

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

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

Пример:

Get-ChildItem |Out-File .\2.txt -Width 40

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

Каталог: 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

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

Пример:

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» Которое указывает в какой файл записать данные.

Пример:

Tee-Object -FilePath 3.txt

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

 

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

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

Пример:

Get-ChildItem *.txt|Tee-Object -Variable listfile |Get-Content

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

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

 

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

Пример:

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

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

Пример:

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-символы.

Пример:

PS C:\Temp> Get-content -LiteralPath C:\temp\1.txt,C:\temp\1.txt,C:\temp\1.txt
Hello
Hello
Hello

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

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») указывать необязательно.

Пример:

PS C:\Temp> Get-content -Path C:\temp\*.txt |set-content 5.txt

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

 

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

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

Пример:

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». Подстановочные знаки разрешены.

Пример:

PS C:\Temp> Get-content -Path C:\temp\* -Include *.csv,*.txt |set-content 6.txt

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

 

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

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

Пример:

Get-content -Path C:\temp\* -Exclude *.txt,*.csv |set-content 6.doc

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

 

-Force

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

PS C:\Temp> Get-content -Path C:\temp\* -force

 

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

 

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

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

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 «Число строк»

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

Пример:

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 «путь к файлу»

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

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

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 который можно открыть в большенстве табличных редакторах.

#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 — позволяет перезаписать файл с выставленным атрибутом «только на чтение» в тихом режиме.

Пример:

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

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

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, то при выполнении команды будет выведен запрос на подтверждение выполнения команды.

Пример:

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

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

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

PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -NoTypeInformation

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

"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 «Разделитель столбцов»

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

Пример:

Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Delimiter ";"

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

#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

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

(Get-Culture).TextInfo.ListSeparator

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

PS C:\temp> Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -UseCulture

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

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)

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

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

#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»

Пример:

Get-ChildItem *.* |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length|Export-Csv 1.csv -Encoding "UTF8"

 

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

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

Пример:

PS C:\temp> $d= Get-ChildItem *.txt |Select-Object FullName,CreationTime, LastWriteTime,Attributes,Length
PS C:\temp> Export-Csv -InputObject $d 2.csv

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

#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 файлу»

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

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

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 файл, вот такого содержания:

#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 мы увидели свойства дирректории…

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

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

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 с изменённым заголовком:

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, если бы в шапке оказалось бы больше именований столбцов, чем свойств в файле. То свойстива с этими именами остались бы пустыми.

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

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 «Символ разделитель»

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

Как пример:

$a =  Import-Csv 1.csv -Delimiter ","

 

-UseCulture

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

Пример:

$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-представление объекта.

Пример:

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv

 

-Encoding

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

Пример:

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Encoding "ASCII"

 

-InputObject

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

Пример:

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

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

PS C:\Temp> Get-ChildItem *.* | Export-Csv -Path 1.csv -Force

 

-NoClobber

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

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

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

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

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 «число уровня вложенности»

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

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

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

PS C:\temp> $d[0]


    Каталог: C:\Windows\System32\Speech\SpeechUX


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        12.04.2011     19:26            ru-RU

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

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

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:

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)

 

]]>
https://coolcode.ru/powershell-rabota-s-faylami-import-i-eksport-obektov-v-tekstovyie-faylyi/feed/ 0
Запуск ps1 скрипта. PowerShell https://coolcode.ru/zapusk-ps1-skripta-powershell/ https://coolcode.ru/zapusk-ps1-skripta-powershell/#comments Tue, 16 Sep 2014 09:42:20 +0000 http://coolcode.ru/?p=2026

Самое первое из за чего обычно не запускается скрипт написанный на powershell это из за следующих ошибок:

Файл <file-name> невозможно загрузить. Файл <file-name> не имеет цифровой подписи. Скрипт не будет выполнен в системе. Чтобы получить дополнительные сведения, введите команду «Get-Help about_signing».
The file <file-name> cannot be loaded. The file <file-name> is not digitally signed. The script will not execute on the system. Please see «Get-Help about_Signing» for more details.

или


Запустить программу от ненадежного издателя? Файл <file-name> опубликован CN=<publisher-name>. Этот издатель не помечен как надежный в данной системе. Выполнять следует только скрипты надежных издателей.
[V] Никогда не выполнять [D] Не выполнять [R] Выполнить один раз [A] Всегда выполнять [?] Справка (по умолчанию «D»):
Do you want to run software from this untrusted publisher? The file <file-name> is published by CN=<publisher-name>. This publisher is not trusted on your system. Only run scripts from trusted publishers.
[V] Never run  [D] Do not run  [R] Run once  [A] Always run [?] Help (default is «D»):

 

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

Поэтому обычно данную проблему решают командой:

Set-ExecutionPolicy Unrestricted LocalMachine

Применить данную команду рекомендуется в консоли PowerShell запущенной от имени администратора. Данная команда разрешит выполнять, на данном компьютере, не подписанные скрипты и скрипты из Интернета.

Если данное решение вас не устраивает разберёмся подробнее.

 

Get-Executionpolicy

Посмотреть текущие настройки политики во всех областях применения можно выполнив командлет Get-Executionpolicy с параметром list.

Пример:

get-executionpolicy -list

Результат выполнения командлета:

Scope ExecutionPolicy
#8212;#8212; —————
MachinePolicy Unrestricted
UserPolicy Undefined
Process RemoteSigned
CurrentUser AllSigned
LocalMachine Restricted

 

Значения политики.

Данная политика может принимать 6 значений:

Restricted (Политика выполняется по умолчанию. Например если во всех областях применения стоит значение Undefined)
— Допускает отдельные команды, но скрипты выполнять нельзя.
— Препятствует выполнению всех файлов скриптов, включая файлы форматирования и конфигурации (PS1XML), файлы скриптов модулей (PSM1) и профили Windows PowerShell (PS1).

AllSigned
— Выполнение скриптов разрешено.
— Требует, чтобы все скрипты и файлы конфигурации были подписаны надежным издателем, в том числе скрипты, подготовленные на локальном компьютере.
— Перед выполнением скриптов издателей, для которых еще не определено, являются ли они надежными, выводятся предупреждения.
— Имеется риск выполнения неподписанных скриптов из источников, отличных от Интернета, а также подписанных, но вредоносных скриптов.

RemoteSigned
— Выполнение скриптов разрешено.
— Требует наличия цифровой подписи надежного издателя у скриптов и файлов конфигурации, загружаемых из Интернета (включая электронную почту и программы мгновенного обмена сообщениями).
— Не требует наличия цифровых подписей у скриптов, выполняемых и написанных на локальном компьютере (не загруженных из Интернета).
— Имеется риск выполнения подписанных, но вредоносных скриптов.

Unrestricted
— Могут выполняться неподписанные скрипты. (Имеется риск выполнения вредоносных скриптов.)
— Предупреждает пользователя перед выполнением скриптов и файлов конфигурации, загруженных из Интернета.

Bypass
— Ничего не блокируется, и никакие предупреждения и запросы не появляются.
— Эта политика выполнения предназначена для конфигураций, в которых скрипт Windows PowerShell встроен в более крупное приложение, или для конфигураций, в которых Windows PowerShell является платформой для программы, у которой имеется собственная модель обеспечения безопасности.

Undefined
— В текущей области не задана политика выполнения.
— Если политика выполнения во всех областях имеет значение Undefined, действует политика выполнения Restricted, которая является политикой выполнения по умолчанию.

 

Области применения политики.

Областей применений пять:

MachinePolicy и UserPolicy задаются политиками AD или локальными политиками данного компьютера.
Process — область применения текущая ссесия. В справке говорится, что её значение хранится в переменной $PSExecutionPolicyPreference однако получить/изменить значение данной политики через переменную не удалось. Измения сделанные на эту область применения ни как не повлияют на другие сессии.
CurrentUser — область применения текущей пользователь. Её значение хранится в разделе реестра HKEY_CURRENT_USER («HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\ExecutionPolicy»).
LocalMachine — область применения на всех пользователей текущего компьютера. Она хранится в разделе реестра HKEY_LOCAL_MACHINE(«HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\ScriptedDiagnostics\ExecutionPolicy»).

 

У команды get-executionpolicy есть параметр -Scope. С помощью данного параметра можно выбрать область применения для которого отобразиться значение политики.
Прмер:

Get-ExecutionPolicy -scope Process

Результат выполнения командлета: RemoteSigned

 

При этом Области применения имеют приоритет высшим обладает MachinePolicy, потом UserPolicy, Process, CurrentUser и самый низкий приоритет у LocalMachine.
Поэтому в примере:

Scope ExecutionPolicy
#8212;#8212; —————
MachinePolicy Unrestricted
UserPolicy Undefined
Process RemoteSigned
CurrentUser AllSigned
LocalMachine Restricted

В текущей ссесии результирующая политика будет иметь значение Unrestricted.

 

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

Пример:

Get-ExecutionPolicy

Вывод: Unrestricted

 

Set-Executionpolicy

Что бы изменять значение политик выполнения скриптов PowerShell, существует коммандлет  Set-ExecutionPolicy.
Данный командлет имеет следующие параметры:

-ExecutionPolicy
Указывает значение политики. Может иметь следующие значения:  Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass, Undefined. Данный параметр обязательный для указания. Если не указан, во время выполнения комадлет попросит указать значения.

Set-ExecutionPolicy

Вывод:
Укажите значения для следующих параметров:
ExecutionPolicy:

 

-Scope
Определяет область применения данной политики. Может иметь следующие значения: LocalMachine ,Process, CurrentUser. Если параметр области применения не указан, по умолчанию указывается значение LocalMachine.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process

или

Set-ExecutionPolicy Unrestricted Process

 

-Force
С этим параметром командлет не будет требовать подтверждения со стороны пользователя.

Пример

Set-ExecutionPolicy Unrestricted Process -Force

Командлет ничего не выведет на экран и применит значение политики.

 

-Confirm
Если же вам наоборот мало одного подтверждения. Можно указать параметр Confirm и у вас будет ещё один, дополнительный, запрос на подтверждение ваших действий:

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process -confirm

Результат выполнения:

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».
[Y] Да — Y  [A] Да для всех — A  [N] Нет — N  [L] Нет для всех — L  [S] Приостановить — S  [?] Справка (значением по умолчанию является «Y»):

Изменение политики выполнения
Политика выполнения защищает компьютер от ненадежных сценариев. Изменение политики выполнения может поставить под угрозу безопасность системы, как описано в разделе справки, вызываемом командой about_Execution_Policies. Вы хотите изменить политику выполнения?
[Y] Да — Y  [N] Нет — N  [S] Приостановить — S  [?] Справка (значением по умолчанию является «Y»):

 

-WhatIf
С параметром WhatIf командлет не выполняется. А выводит на консоль свои предполагаемые действия без данного параметра.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process -WhatIf

Результат выполниня:

 WhatIf: Выполнение операции «Set-ExecutionPolicy» над целевым объектом «Unrestricted».

 

Изменение параметров политики, при запуске консоли.

Так же можно задать значение области применения Process при запуске консоли PowerShell c помощью параметра executionpolicy. Пример:

powershell.exe -executionpolicy Unrestricted
Get-ExecutionPolicy -list

Результат выполнения:

Scope ExecutionPolicy
#8212;#8212; —————
MachinePolicy Unrestricted
UserPolicy Undefined
Process RemoteSigned
CurrentUser AllSigned
LocalMachine Restricted

 

Изменение параметров политики запуска скриптов, с помощью групповых политик.

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

 

для MachinePolicy:

Computer Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell

или

Конфигурация компьютера/Административные шаблоны/Компоненты Windows/Windows PowerShell

 

для UserPolicy:
User Configuration/Policies/Administrative Templates/Windows Components/Windows PowerShell

или

Конфигурация пользователя/Административные шаблоны/Компоненты Windows/Windows PowerShell

 

Параметр Execution Policy может принимать 3 значения:

Значение параметра Execution Policy в групповой политики Значение параметра отображающееся в Get-Executionpolicy
Разрешить все скрипты.
(Allow all scripts)
Unrestricted
Разрешить локальные скрипты и удаленные подписанные скрипты.
(Allow local scripts and remote signed scripts)
RemoteSigned
Разрешить только подписанные скрипты.
(Allow all scripts)
AllSigned

 

]]>
https://coolcode.ru/zapusk-ps1-skripta-powershell/feed/ 2
Строки в PowerShell https://coolcode.ru/stroki-v-powershell/ https://coolcode.ru/stroki-v-powershell/#comments Mon, 28 Apr 2014 07:19:34 +0000 http://coolcode.ru/?p=750

Результатом выполнения команда в PowerShell являются объекты. Поэтому работ со строками сильно по уменьшилось. Но иногда приходится обрабатывать и текст.

Начнём с того, что получить строку в PowerShell довольно легко. Так например что бы получить и вывести строку: «Hello World!». Надо выполнить следующую команду:

"Hello World!"

Строки Нумирация символов в строке начинается с нулевого символа.  Максимальная длина строки в PowerShell зависит от характеристики компьютера. Так на XP она состовляет с 4 гигами оперативной памяти она составляет 151.001.191 символ, а на 8.1 с 8 Гб оперативной памяти до 1.073.741.791 символов.

Обратится к конкретному символу строки можно по следующему шаблону:

(строка) [номер символа]

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

"Hello World!"[6]

Будет символ W, это седьмой символ в строке, но нумерация начинается с нуля.

Так же можно воспользоваться методом Chars, указав в его параметре номер символа. Синтаксис данного метода:

[строка].Chars([номер символа])

Пример:

«Hello World!».Chars(6)

Результатом данной команды будет так же символ W.

Что бы присвоить переменной значение , надо воспользоваться оператором =

Пример:

$a ="Hello"

$a

В результате на консоль будет выведена строка «Hello»

Так же можно склеивать строки с помощью оператора +

Например:

$a =$a+" World!"

$a

или

$a += " World!"

$a

В результате на консоле будет выведена строка «Hello World!»

Так же со строками можно применять операторы сравнения, такие как

«-eq» — (=) проверяет равны ли строки между собой

«-ne» — (≠) обратный оператору -eq проверяет неравенство строк

«-gt» — (>) больше ли одна строка чем другая

«-lt» — (<) меньше ли одна строка чем другая

«-le» — (≤) меньше или равна одна строка чем другая

«-ge» — (≥) больше или равна одна строка чем другая

Самым часто используемым оператором среди них это «-eq». Пример:

"Hello World!" -eq  "Hello World!"

Результат будет True, так как строки идентичны.

Операторы же -gt, -lt, -le, -ge по сути могут помочь определить начинается ли данная строка подстрокой, пример:

Например так:

"Hello World!" -gt  "Hello"

Результатом будет True. Однако логичнее для этого использовать метод самой строки StartsWith о нём написано ниже.

Так же есть методы сравнения -like и -match

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

"Hello World!" -Like  "Hello*!"

Результатом будет : True

Оператор -match использует регулярные выражения .NET. Что существенно увеличивает возможности данного метода.

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

"Hello World!" -match  "Hello[\D]*!"

Результатом будет : True

При этом, в переменной $matches хранятся значения совпадений данного регулярного выражения. Это даёт большие возможности. Рассмотрим пример, как получить все строчки с ссылками из текста:

$a = get-help Get-Help -detailed

$a -match "http://.*/"

$matches[0].split(";")

Результатом выполнения данного скрипта будет следующий набор строк: @(«http://schemas.microsoft.com/maml/2004/10», «xmlns:command=http://schemas.microsoft.com/maml/dev/command/2004/10″,»xmlns:dev=http://schemas.microsoft.com/maml/dev/2004/10″,»xmlns:MSHelp=http://msdn.microsoft.com/»)

Надо отметить утверждение о том, что все объекты в PowerShell являются объектами и строки тоже не являются исключениями.

Рассмотрим методы которые можно применить, для строк:

"Hello World!" | gm

 

Clone — копия объекта.

Результатом метода будет точная копия данного объекта.

Его синтаксис: [String]=[Строка].Clone()

Например результатом данной команды:

("Hello World!").Clone()

Будет строка «Hello World!».

 

CompareTo — сравнение двух строк

Вызывается он [int]= [1 строка].CompareTo([2 строка])

Результат данного метода 0 — тогда строки совпадают. Могут ещё быть -1 и 1.

-1 означает, что строка 1 меньше строки 2.

1 означет, что строка 1 больше строки 2

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

("Hello World!").CompareTo("Hello");

будет 1, а выражения

("Hello World!").CompareTo("hello world!");

будет -1.

Что бы сравнить две строки без учёта регистра, то надо воспользоваться методом .NET:

[string]::Compare([строка 1], [строка 2], [игнорировать ли регистр])

Сравним им строчки «Hello World!» и «hello world!»

[string]::Compare("Hello World!","hello world!",$True)

Результатом будет 0, то есть две строки равны.

 

Contains — Нахождение подстроки

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

синтаксис метода такой:

[bool] = [строка 1].Contains([строка 2])

Результатом данного метода будет булевое значение, которое будет равно 0 если строка 2 будет являтся подстрокой строки 1.

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

("Hello World!").Contains("World")

результатом данного выражение будет значение «True». Однако данный метод чувствителен к регистру.

 

 

EndsWith — Заканчивается ли строка подстрокой

Синтаксис данного метода [bool] = [строка 1].EndsWith([строка 2])

Данный метод определит, заканчивается ли строка 1  — строкой 2.

например:

("Hello World!").EndsWith("World!")

Результат True

 

StartsWith — начинается ли строка с подстроки

Синтаксис данного метода [bool] = [строка 1].StartsWith([строка 2])

Аналогично EndsWith  данный метод определит начинается ли строка 1 со строки 2.

Пример:

("Hello World!").StartsWith("Hello")

Результат True

 

Equals — сравнение двух строк

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

[bool] = [строка 1].Equals([строка 2])

Пример:

("Hello World!").Equals("Hello World!")

Результатом данной операции будет True

Однако это удобнее записать так:

"Hello World!" -Eq "Hello World!"

 

GetHashCode- получить Hash Code строки

Синтаксис этого метода:

[int] = [строка 1].GetHashCode()

Результатом выполнения Метода, на строке «Hello World!» :

("Hello World!").GetHashCode()

Будет: «-1989043627»

 

 

IndexOf — индекс начала вхождения подстроки.

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

Синтаксис:

[int] = [строка 1].IndexOf([строка 2])

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

("Hello World!").IndexOf("World")

Результатом выполнения данного скрипта, будет  «6». Так как нумерация строки начинается с нулевого символа.

 

LastIndexOf — Последнее вхождение подстроки

В отличии от IndexOf показывает не первое значение входа подстраки а последнее , синтаксис этого метода:

[int]=[строка 1].LastIndexOf([строка 2])

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

("Hello World!").LastIndexOf("o")

Результатом будет значение 7.

 

IndexOfAny — первое вхождение любого символа из подстроки в строке.

Синтаксис:

[int] = [строка 1].IndexOfAny([строка 2])

Данный метод позволит получить первое вхождение любого символа из строки 2 в строке 1

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

("Hello World!").IndexOfAny("World")

Результатом будет 2, так как l присутствует и в слове World

 

LastIndexOfAny  — последнне вхождение любого символа из подстроки в строке.

Синтаксис:

[int] = [строка 1].LastIndexOfAny([строка 2])

Анологично IndexOfAny ищет значение входа символов подстроки в строке, но выводит не первое вхождение, а последнее

Пример:

(«Hello World!»).LastIndexOfAny(«World»)

результатом данной команды будет 10, и это символ «d «.

 

Insert — Вставить в строку, подстроку.

Синтаксис:

[String]= [строка 1].Insert([Номер символа],[строка 2])

Результатом данного метода будет строка содержащая строку 2 начиная с символа «Номер символа»

Пример:

("Hello World!").Insert(11," of Warcraft")

Результатом выполнения данного скрипта будет строка : «Hello World of Warcraft!»

 

PadLeft — дополнить строку символами с лева

Что бы дополнить строку до определённого кол-ва символов. Если мы хотим, что бы символы дополнялись с лева, можно воспользоваться командой PadLeft её синтаксис:

[String] =  [строка 1].PadLeft([размер строки],[символ которым заполнять])

Пример:

"Hello World!".PadLeft(20,".")

Результатом данной команды будет строка: «……..Hello World!»

 

PadRight — дополнить строку символами с права

Аналогично, как и PadLeft дополняет строку до указанного размера, символами, добавляя их с права. Синтаксис:

[String] =  [строка 1].PadRight([размер строки],[символ которым заполнять])

Пример:

"Hello World!".PadRight(20,".")

Результат данной команды будет строка : Hello World!……..

 

Remove — позволяет удалять из строки подстроки

Метод Remove перегружен и может использоваться в следующих синтаксисах:

[String] = [строка 1].Remove([кол-во символов])

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

Пример:

("Hello World!").Remove(2)

Результатом будет строка: «He»

Если же воспользоваться синтаксисом:

[String] = [строка 1].Remove([начальная позиция],[кол-во символов])

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

Пример:

("Hello World!").Remove(4,2)

Результат: «HellWorld!»

 

Substring — позволяет получить подстроку из строки

Метод Substring является кординально противоположный, чем метод Remove

Он так же перегружен и может использоватся в двух вариациях.

[String] = [строка 1].Substring([кол-во символов])

Результатом данной команды будет подстрока образованная из строки 1 путём удаления данное кол-во символов.

Пример:

"Hello World!".Substring(3)

Результатом данной команды будет строка: «lo World!»

Так же существует другой синтаксис:

[String] = [строка 1].Substring([начальная позиция],[кол-во символов])

Тогда результатом данного метода будет подстрока сформированная из строки 1 содержащая указанное кол-во символов и начинающаяся с указанной позиции.

Пример:

"Hello World!".Substring(6,5)

Результатом будет строка «World»

 

Replace — найти подстроку и заменить на свою

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

Синтаксис:

[String] = [строка 1].Replace([старая подстрока],[новая подстрока])

Пример:

("Hello World!").Replace("Hello","Goodbye")

Результат «Goodbye World!»

 

Split — разбить строку на массив строк.

Иногда строку легче обрабатывать массивом, для этого есть метод Split. Он позволяет разбить строку на массив подстрок с помощью разделяющего символа или группу символов.

Синтаксис:

[string[] ]= [строка 1].Split([разделяющий символ])

Пример:

("Hello World !").Split(" ")

результатом будет массив строк»Hello»,»World,!»

Если нам нужно указать не один разделитель а несколько, укажите перечисление:

Пример:

"Hello World!".Split(@("o","e"))

Результатом будет массив строк :»H»,»ll»,» W»,»rld!»

Trim, TrimLeft, TrimRight — удаляем одинаковые символы по бокам страницы

Иногда нужно удалить повторяющиеся символы по бокам строки. Очень часто такими символами являются пробелы, для этого существует метор Trim он существует в следующих вариациях Trim, TrimLeft, TrimRight они отличаются областью действия, Trim отбрасывает не нужные символы с двух сторон строки, TrimLeft — только с лева, TrimRight — только с права.

что бы убрать лишние пробелы можно воспользоваться следующим синтаксисом:

[String]=[строка 1].Trim()

[String]=[строка 1].TrimLeft()

[String]=[строка 1].TrimRight()

Пример:

"           Hello World!         ".Trim()

Результатом данной команды будет строка «Hello World!»

Если же мы хотим удалить не пробел, то этот символ надо ввести в параметр метода. Синтаксис:

[String]=[строка 1].Trim([удаляемый символ])

[String]=[строка 1].TrimLeft([удаляемый символ])

[String]=[строка 1].TrimRight([удаляемый символ])

Пример:

".........Hello World!........".Trim(".")

Результатом данной команды будет строка «Hello World!»

 

Свойство Length — позволяет определить размер строки

Что бы посмотреть размер строки, надо воспользоваться свойством Length. Синтаксис:

[int] = [строка].Length

Пример:

"Hello World!".Length

Результатом команды будет число 12

 

Преобразования строк в различные типы

У строки так же имеется ряд методов, которые конвертируют данные из  строки в различные типы. Эти свойства ToBoolean, ToByte, ToChar,  ToCharArray, ToDateTime, ToDecimal, ToDouble, ToInt16, ToInt32, ToInt64, ToLower, ToLowerInvariant, ToSByte, ToSingle, ToString, ToType, ToUInt16, ToUInt32, ToUInt64, ToUpper, ToUpperInvariant

 

GetEnumerator — получить перечисление

Полученить перечисление из строки.

Синтаксис этого метода:

[System.CharEnumerator] = [строка 1].GetEnumerator()

("Hello World!").GetEnumerator()

Результатом данного метода будет перечисление @(‘H’,’e’,’l’,’l’,’o’,’ ‘,’W’,’o’,’r’,’l’,’d’,’!’)

 

GetType — получить тип объекта

Так как мы рассматриваем строки то возращаемый тип строки это String

Синтаксис:[System.RuntimeType] =  [строка 1].GetType()

("Hello World!").GetType()

Результатом будет объект System.RuntimeType со значением типа String

 

GetTypeCode — получить код типа объекта

Получить тип объекта, если мы работаем со строками то тип будет String.

Синтаксис: [System.TypeCode] = [строка 1].GetTypeCode()

("Hello World!").GetTypeCode()

Результатом будет объект типа System.TypeCode со значением String

 

Говоря о строках, нельзя не упомянуть о командлете Select-String данный командлет является достойной альтернативой Grep в Unix он позволяет искать строки используя регулярные выражения .NET. Но рассматривать его лучше вместе с регулярными выражениями.

 

 

]]>
https://coolcode.ru/stroki-v-powershell/feed/ 6
Изменяем внешний вид System.Windows.Forms.Form https://coolcode.ru/izmenyaem-vneshniy-vid-system-windows-forms-form/ https://coolcode.ru/izmenyaem-vneshniy-vid-system-windows-forms-form/#comments Fri, 11 Apr 2014 05:48:24 +0000 http://coolcode.ru/?p=127

Форма является основным компонентом графического интерфейса программы. Именно на ней размещаются управляющие интерфейсы.

Рассмотрим некоторые из свойств формы, которые влияют на её внешний вид.

 

Объявляем форму

Для  того что бы объявить форму, нам надо добавить библиотеку System.Windows.Forms.dll

Add-Type -assembly System.Windows.Forms

После объявляем форму $main_form

$main_form = New-Object System.Windows.Forms.Form

Отобразим форму $main_form.

$main_form.ShowDialog()

 

В результате получилась вот такая форма:

DefaultForm

Что бы в загаловке формы отобразить текст нужно присвоить его свойству Text нашей формы:

$main_form.Text="Hello"

Текст отобразится в заголовке:

DefaultFormTextHello

 

Изменение размера формы:

Давайте изменим размер формы.

Это можно сделать через свойства Width(ширина) и Height(высота) формы, где значения параметров это кол-во пикселей.

Пример:

$main_form.Width = 300
$main_form.Height = 500

Этого же результата можно добиться используя параметр формы Size:

$main_form.Size =  New-object System.Drawing.Size(300, 500)

Так же можно задать размер с помощью параметра DesktopBounds:

$main_form.DesktopBounds = New-object System.Drawing.Rectangle(0,0, 300, 500)

Так же для изменения размеров можно воспользоваться свойством ClientSize

$main_form.ClientSize  = New-object System.Drawing.Size(300,500)

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

 

Однако данные свойства не ограничивают размер формы в период жизни программы, пользователь может изменить размер формы или распахнуть её на весь экран, что может существенно сказаться на внешнем виде формы. Поэтому иногда форму приходится ограничить возможность сжимать и/или растягивать форму.

Для этогу существуют такие параметры , как MinimumSize(минимальный размер формы) и MaximumSize (максимальный размер формы). Если задать эти параметры, то в период жизни форма не сможет за них выйти.

Пример объявления данных свойств:

$main_form.MinimumSize = New-object System.Drawing.Size(100, 100)#Минимальный размер окна
$main_form.MaximumSize = New-object System.Drawing.Size(600, 600)#Максимальный размер окна

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

Для этого с начала надо разрешить  менять размер формы, в зависимости от расположения объектов в области видимости свойством AutoSize перевести его в значение true

$main_form.AutoSize = $true

После надо выбрать режим автоматического подбора размера формы и указать его в свойстве AutoSizeMode. Существует два режима этого свойства GrowOnly и GrowAndShrink:

GrowOnly — режим разрешает ужимать размер формы если в этой области нет элементов управления, но не меньше, чем указанов параметрах Width и Height

GrowAndShrink —  режим разрешает ужимать размер формы если в этой области нет элементов управления, игнорируя параметры Width и Height но не меньше чем MinimumSize, при этом форма не будет растягиваться по требованию пользователя, но форму можно будет развернуть на всё окно.

$main_form.AutoSizeMode =[System.Windows.Forms.AutoSizeMode]::GrowOnly

или

$main_form.AutoSizeMode =[System.Windows.Forms.AutoSizeMode]::GrowAndShrink

 

Шрифты

Так же не малую роль в отображении формы влияют шрифты. К тому же настройки шрифтов наследуются на управляющие элементы принадлежащие этой форме.

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

$main_form.Font = New-Object System.Drawing.Font ("Calibri",24)

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

$main_form.ForeColor = "#FF0000" # цвет шрифта

Не малуюроль в определении размеров управляющих элементов играет размер шрифта его можно узнать из свойства AutoScaleBaseSize, его так же можно перераспределить.

#$main_form.AutoScaleBaseSize="10,10";

 

Шаблон окна

Шаблон окна формы опредиляется парметром FormBorderStyle, который может принимать семь значений Fixed3D, FixedDialog, FixedSingle, FixedToolWindow, None, Sizabl, SizableToolWindow по умолчанию стоит значение Sizable. Заметим, что внешний вид формы на примерах может существенно отличаться на разных компьютерах и существенно зависит от OC. Так же после назначения определённого шаблона окна в дальнейшем его можно будет редактировать другими свойствами формы.

Рассмотрим шаблоны формы:

Fixed3D — Фиксированная трехмерная граница. Форме запрещено менять размер, однако её можно развернуть на весь экран или свернуть.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D

FormBorderStyleFixed3D

 

FixedDialog — Толстая фиксированная граница в диалоговом окне-стиля. Так же как и в Fixed3D запрещено менять размер. Однако иконка в левой верхней части окна не отображается.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog

FormBorderStyleFixedDialog

 

FixedSingle — фиксированная, одно строковая граница.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle

FormBorderStyleFixedSingle

 

FixedToolWindow — Граница окна инструментов, которое нельзя изменить. Окно инструментов не отображается в панели задач или в окно, которое появляется при нажатии пользователем клавиши ALT+TAB. Хотя форма FixedToolWindow не отображается в панели задач, однако лучше явно необходимо установить свойство ShowInTaskbar в значение false.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow

FormBorderStyleFixedToolWindow

 

None — Форма без рамки. Она не умеет изменять размер, и свёртываться в панель задач, но её можно развернуть.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None

FormBorderStyleNone

 

Sizable — Граница с изменяемыми размерами. Данная форма может изменять размер, разворачиваться и сворачиваться в панель задач.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Sizable

FormBorderStyleSizable

 

SizableToolWindow — Окно может изменять размер окна, разворачивать окно на всё окно, сворачивать в панель задач. Однако кнопки MaximizeBox и MinimizeBox не отображаются.  Так же окно не отображается в панели задач однако окно появляется при нажатии клавиш ALT+TAB.

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::SizableToolWindow

FormBorderStyleSizableToolWindow

 

Управляющие кнопки

Для управления отображения управляющими кнопками используются следующие свойства ControlBox, MaximizeBox и MinimizeBox.

Свойство ControlBox  управляет видимостью всей областью управляющих кнопок. По умолчанию она находиться в состоянии true.

DefaultFormTextHello

Зададим данному свойству значение false

$main_form.ControlBox = $false

 

FormControlBoxFalse

Если в форме свойству Text присвоить пустое значение, то шапка формы совсем исчезнет.

$main_form.Text=""

Вот так будет выглядеть форма:

FormNotTitle

 

Включим назад ControlBox и рассмотрим следующие свойства: MaximizeBox и MinimizeBox. Они тоже булевые и служат для того, что бы выключать кнопки развернуть окно и свернуть окно. По умолчанию они имеют свойство true. Рассмотрим как выглядит их выключение:

$main_form.MaximizeBox = $false
$main_form.MinimizeBox = $true

FormMaximizeBoxFalse

 

$main_form.MaximizeBox = $true
$main_form.MinimizeBox = $false

FormMinimizeBoxFalse

 

Однако, если выключить и  MaximizeBox и MinimizeBox кнопки перестают быть видимыми:

$main_form.MaximizeBox = $false
$main_form.MinimizeBox = $false

FormMaximizeBoxMinimizeBoxFalse

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

С отключённым ControlBox отключается возможность изменять размер формы, но её можно распахнуть и свернуть, например сочитанием клваишь «win»+»up» и «win»+»down».

 

Иконка.

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

$main_form.Icon = New-Object System.Drawing.Icon("d:\favicon.ico")

Где «d:\favicon.ico» это путь к иконке.

FormIcon

Если же мы не хотим, что бы иконка отображалась, то её можно скрыть, с помощью свойства ShowIcon установив его в состояние false. Если же шаблон окна не подразумевает наличия иконки, её так же можно включить через это свойство установи параметр truе

$main_form.ShowIcon = $false

 

Элемент захвата

Для того, чтобы задать видимость захвата для изменения размера, отображаемого в правом нижнем углу формы. Нужно воспользоваться свойством SizeGripStyle. Оно имеет 3 значенич Auto, Hide, Show

Auto

Данное значение стоит по умолчанию. Форма сама решает отображать этот элемент или нет.

$main_form.SizeGripStyle = [System.Windows.Forms.SizeGripStyle]::Auto

 

Hide

Элемент будет скрыт с формы.

$main_form.SizeGripStyle = [System.Windows.Forms.SizeGripStyle]::Hide

FormSizeGripStyleHide

 

Show

элемент отображается на форме

$main_form.SizeGripStyle = [System.Windows.Forms.SizeGripStyle]::Show

FormSizeGripStyleShow

 

Цвет и прозрачность.

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

$main_form.BackColor = "0x000099"

FormBackColor

Но однотонный цвет може не совсем удовлетворять нашим потребностям… для этого можно указать картинку в качестве заднего фона, с помощью свойства формы BackgroundImage

$main_form.BackgroundImage = [System.Drawing.Image]::FromFile("d:\favicon.png")

FormBackgroundImage

 

Мы так же можем определить, какой цвет на форме будет являтся «прозрачным» но этот эфект больше похож на вырезание дырок в форме, так как клик по прозрачной части формы будет обрабатываться не формой, а окном за ней. Для этого сначало, надо разрешить использовать прозрачность, для этого в свойстве AllowTransparency мы должны присвоить знчение true
$main_form.AllowTransparency =$true

А в свойстве TransparencyKey формы мы должны указать, какой цвет будет заменяться на прозрачный.

$main_form.TransparencyKey = "0xFFFFFF"

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

FormTransparencyKey

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

$main_form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None

 

Если же мы не хотим делать дырки в форме, а всеволишь сделать её слегка прозрачной, мы можем воспользоваться свойством Opacity, значения в ней колеблятся от 0 это полностью прозрачная до 1, не прозрачная.

$main_form.Opacity = 0.6

FormOpacity

 

Курсор

Для изменения вида курсора в приложении можно воспользоваться свойством формы Cursor:

$main_form.Cursor = New-Object System.Windows.Forms.Cursor("d:\Cursor.cur")

После данного действия курсор над приложением будет заменятся на «d:\Cursor.cur».

Так же можно узнать перехватывается ли курсор приложением в даннй момент, для этого нужно посмотреть данные свойства формы Capture

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

#$main_form.UseWaitCursor = $true

 

Состояние окна.

Что бы узнать в каком состоянии находиться окно или изменить его, можно воспользоваться свойством формы WindowState оно принимает три значения Maximized, Minimized, Normal.

Что бы развернуть окно:

$main_form.WindowState =[System.Windows.Forms.FormWindowState]::Maximized

Свернуть в панель задач:

$main_form.WindowState =[System.Windows.Forms.FormWindowState]::Minimized#свёрнуто

Перевести в обычный(свободный) режим:

$main_form.WindowState =[System.Windows.Forms.FormWindowState]::Normal

 

Зеркальный вид окна

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

Для этого нам нужно сначала включить поддержку ввода текста с права на лево свойством формы RightToLeft

$main_form.RightToLeft = [System.Windows.Forms.RightToLeft]::YES

У этого свойства кроме значения YES, который включает поддержку ввода текста с права на лево, существуют другие параметры. Это  NO выключает поддержку ввода текста с права на лево. И Inherit — наследовать значения от родительского элемента, установленно по умолчанию.

Только после этого можно отобразить форму зеркально установив свойство формы RightToLeftLayout в значение true

$main_form.RightToLeftLayout = $true

 

FormMirrored

Посмотреть отображается ли форма в зеркальном виде можно из свойства формы IsMirrored.

 

 

Отображение в Панели задач.

Для того, что бы скрыть форму из панели задач, есть следующее свойство формы ShowInTaskbar. Это свойство имеет булевый тип и чтобы форма скрылась из пнели задач надо указать значение false. Однако эту форму можно будет найти по «Alt»+»Tab»

$main_form.ShowInTaskbar = $false

 

Видимость окна.

Так же если надо сделать, что бы форма не закрывалась другими окнами можно воспользоваться свойством TopMost. Если установить его в значение true то другие окна не смогут заслонить его.

$main_form.TopMost = $true

 

Для формы существуют параметры видимости, но для отображения формы лучше пользоваться функция Enabled если установить его в значение false, то его не удасться отобразить методом ShowDialog().

Так же если надо скрыть форму, то это можно сделать изменив свойство Visible на false. Можно так же отобразить форму, но это может быть не всегда хорошей идеей, лучше пользоваться методом ShowDialog.

$main_form.Visible = $false

 

]]>
https://coolcode.ru/izmenyaem-vneshniy-vid-system-windows-forms-form/feed/ 12