<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Богдан Стефанюк: дописи з тегом powershell</title>
<link>https://stefaniuk.website/tags/powershell/</link>
<description>Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.</description>
<author></author>
<language>uk</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Работа с файлами в Powershell</title>
<guid isPermaLink="false">76</guid>
<link>https://stefaniuk.website/all/work-with-file-system-in-powershell/</link>
<pubDate>Wed, 19 Jun 2019 08:35:12 -0400</pubDate>
<author></author>
<comments>https://stefaniuk.website/all/work-with-file-system-in-powershell/</comments>
<description>
&lt;p&gt;&lt;b&gt;Получение списка файлов&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Get-ChildItem $path&lt;/i&gt; — отобразит список файлов по указанному пути.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Get-ChildItem -Force $path&lt;/i&gt; — отобразит список файлов (включая скрытые) по указанному пути.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Get-ChildItem -Force $path -Recurse&lt;/i&gt; — отобразит список всех файлов, а также вложенных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Копирование файлов и папок&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;New-Item -Path $path -ItemType «directory | file»&lt;/i&gt; — создает объект в файловой системе.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Удаление всех файлов и папок, содержащихся в папке&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Remove-Item $path&lt;/i&gt; — удалит все файлы по указанному пути, но будет предлагать подтверждения.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Remove-Item $path -Recurse&lt;/i&gt; — удалит все файлы без подтверждения.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Работа с содержимым файла&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Get-Content -Path $path&lt;/i&gt; — вычитать содержимое файла.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Add-Content -Path $path «Additional content»&lt;/i&gt; — дописывает в конец файла текст.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Set-Content -Path $path -Value «New content»&lt;/i&gt; — позволяет перезаписать содержимое файла&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Get-Date | Set-Content $path&lt;/i&gt; — также можно использовать в качестве пайпалайна&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Out-File -FilePath $path&lt;/i&gt; — отправляет вывод в файл.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Out-File -FilePath $path -Append&lt;/i&gt; — дописывает данные в конец файла&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Автоматизация релизов Github с помощью Powershell и Teamcity</title>
<guid isPermaLink="false">62</guid>
<link>https://stefaniuk.website/all/automate-github-releases-by-powershell-and-teamcity/</link>
<pubDate>Tue, 14 May 2019 07:03:53 -0400</pubDate>
<author></author>
<comments>https://stefaniuk.website/all/automate-github-releases-by-powershell-and-teamcity/</comments>
<description>
&lt;p&gt;Совсем недавно о одном open-source проекте, в котором я участвую, потребовалось автоматизировать создание релизов на Github. В моем распоряжении есть TeamCity. Решил написать небольшой план, который состоит из следующих шагов:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Выкачать проект.&lt;/li&gt;
&lt;li&gt;Скомпилировать.&lt;/li&gt;
&lt;li&gt;Опубликовать Release версию в папку.&lt;/li&gt;
&lt;li&gt;Собрать артефакт Teamcity.&lt;/li&gt;
&lt;li&gt;Упаковать билд в архив.&lt;/li&gt;
&lt;li&gt;Создать страницу релиза на Github с описанием.&lt;/li&gt;
&lt;li&gt;Выгрузить на страницу архив с билдом.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Для решения 5-6 пунктов был написан простой powershell скрипт, который можно посмотреть по &lt;a href="https://github.com/teamkiller7112/PowerShellScriptsArchive/blob/master/Greate-GithubRelease.ps1"&gt;этой ссылке.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P.S. В дальнейшем, в репозиторий буду добавлять друге полезные скрипты.&lt;br /&gt;
Ссылка на репозиторий: &lt;a href="https://github.com/teamkiller7112/PowerShellScriptsArchive"&gt;https://github.com/teamkiller7112/PowerShellScriptsArchive&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Лучшие практики использования PowerShell c TeamCity</title>
<guid isPermaLink="false">60</guid>
<link>https://stefaniuk.website/all/best-practices-for-using-powershell-with-teamcity/</link>
<pubDate>Sun, 12 May 2019 13:57:44 -0400</pubDate>
<author></author>
<comments>https://stefaniuk.website/all/best-practices-for-using-powershell-with-teamcity/</comments>
<description>
&lt;p&gt;Данная статья является переводом. &lt;a href="https://cezarypiatek.github.io/post/best-practices-for-using-powershell-with-teamcity/?utm_campaign=dotNET%20Weekly&amp;utm_medium=email&amp;utm_source=week-15_year-2019"&gt;Оригинальная статья&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Правильная обработка ошибок&lt;/h2&gt;
&lt;p&gt;Наиболее распространенная проблема заключается в том, что TeamCity игнорирует ошибки Powershell, по крайней мере, в конфигурации по умолчанию. Если шаг со сценарием PowerShell завершится неудачно, TeamCity по-прежнему считает билд успешным. Это может привести к серьезным ошибкам, которые могут быть незаметны длительное время. Это происходит потому что значение настройки &lt;i&gt;Format stderr output as&lt;/i&gt; установлено в &lt;i&gt;warning&lt;/i&gt;. Для того чтобы TeamCity видел ошибки, необходимо переключить настройку в &lt;i&gt;error&lt;/i&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://stefaniuk.website/pictures/error_handling_for_ps.jpg" width="917" height="576" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Но это еще не все. Может возникнуть ситуация что шаг PowerShell упал но весь пайплайн признан успешным. Для этого нужно перейти в раздел &lt;i&gt;Failure Conditions&lt;/i&gt; и установить флаг &lt;i&gt;error message is logged by build runner&lt;/i&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://stefaniuk.website/pictures/teamcity_failure_condition.jpg" width="848" height="312" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь все ошибки буду корректно обрабатываться и влиять на статус билда.&lt;/p&gt;
&lt;p&gt;Также надо понимать модель ошибок в PowerShell. Они могут поделятся на 2 группы:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Завершающие (зачастую синтаксические ошибки).&lt;/li&gt;
&lt;li&gt;Не завершающие.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Если возникло не завершающее исключение, то выполнение скрипта продолжится. Этот эффект может быть крайне нежелательным для сценариев, выполняющих взаимосвязанные операции, зависящие друг от друга. Конечно, мы можем изменить это поведение и превратить все «не завершающиеся» ошибки в «завершающиеся», установив переменную $ErrorActionPreference в начале наших скриптов:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#Error Action Preference:
#
# SilentlyContinue – error messages are suppressed and execution continues.
# Stop – forces execution to stop, behaving like a terminating error.
# Continue - the default option. Errors will display and execution will continue.
# Inquire – prompt the user for input to see if we should proceed.
# Ignore – (new in v3) – the error is ignored and not logged to the error stream. Has very restricted usage scenarios.

$ErrorActionPreference = &amp;quot;Stop&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Защита от случайных ошибок&lt;/h2&gt;
&lt;p&gt;Для начала необходимо превратить все наши функции в настоящие командлеты. Для этого нужно определять входящие параметры с помощью блока &lt;i&gt;param()&lt;/i&gt; и пометить его атрибутом &lt;i&gt;[CmdletBinding()]&lt;/i&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;function Verb-Noun {
    [CmdletBinding()]
    param (
     #parameters go here   
    )    
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Этот атрибут защищает вызов метода с не определенными параметрами. Каждый раз как кто-то использует не определенный/удаленный параметр или делает ошибку в его названии, PowerShell выбросит ошибку. Если метод не помечен атрибутов, имена параметров не проверяются, что затрудняет обнаружение проблемы.&lt;/p&gt;
&lt;p&gt;Также можно обнаружить потенциальные ошибки, вызванные нарушением лучших практик и правил кодирования, включив строгий режим. Чтобы сделать это, добавьте следующий код в начале вашего скрипта:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Set-StrictMode -Version Latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Детальнее можно почитать &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-6"&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Вообще советую использовать VS Core и плагином PowerShell. Он превращает вашу в IDE в аналог PowerShell ISE. Также этот плагин поставляется с PSScriptAnalyzer, что позволяет обнаруживать разные ошибки.&lt;/p&gt;
&lt;h2&gt;Использование скриптов&lt;/h2&gt;
&lt;p&gt;Teamcity дает возможность запускать скрипты не только из файла, но и из встроенного редактора. Но лучшей практикой считается использование файлов. Это позволит держать скрипты в системе контроля версий, вместе с вашим проектом.&lt;/p&gt;
&lt;h2&gt;Всегда помните о чистом коде.&lt;/h2&gt;
&lt;p&gt;Ваши скрипты как и код вашего проекта должен лежать в системе контроля версий, покрыт тестами и пройти ревью. &lt;a href="https://github.com/PoshCode/PowerShellPracticeAndStyle"&gt;Здесь&lt;/a&gt; вы можете найти лучшие практики и стили кодирования для PowerShell. Для тестирования кода можете использовать — &lt;a href="https://github.com/pester/Pester"&gt;Pester&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Итог&lt;/h2&gt;
&lt;p&gt;Связка PowerShell и Teamcity позволяет создать действительно мощный CI/CD. Но без понимания базовых принципов и механизмов вы не достигните максимального профита. Настройки по умолчанию часто могут приводить к непредвиденным ошибкам.&lt;/p&gt;
&lt;h2&gt;Ссылки&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;a href="https://github.com/PoshCode/PowerShellPracticeAndStyle"&gt;Практики и стили кодирования для PowerShell скриптов.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;((&lt;a href="https://github.com/pester/Pester"&gt;https://github.com/pester/Pester&lt;/a&gt; Pester — тест и мок фреймворк для PowerShell.)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-6"&gt;PowerShell strict mode&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>PowerShell: создание Credentials.</title>
<guid isPermaLink="false">45</guid>
<link>https://stefaniuk.website/all/powershell-credentials/</link>
<pubDate>Thu, 04 Apr 2019 16:54:17 -0400</pubDate>
<author></author>
<comments>https://stefaniuk.website/all/powershell-credentials/</comments>
<description>
&lt;p&gt;Для того чтобы работать с авторизацией пользователя в powershell существую следующие понятия:&lt;br /&gt;
&lt;b&gt;String&lt;/b&gt; — простая строка, в ней можно сохранять пароль, но не желательно, так как она хранится в памяти в открытом виде.&lt;br /&gt;
&lt;b&gt;System.Security.SecureString&lt;/b&gt; — выглядит как обычная строка, но она зашифрована. Она использует «обратимое» шифрование, так что мы в любой момент можем декодировать пароль.&lt;br /&gt;
&lt;b&gt;System.Management.Automation.PSCredential&lt;/b&gt; — класс, который содержит в себе логин и зашифрованный пароль. Данный тип есть почти у каждой команды, которая поддерживает авторизацию.&lt;/p&gt;
&lt;h2&gt;Создание SecureString&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Чтение из консоли
$SecurePassword = Read-Host -Prompt &amp;quot;Enter password&amp;quot; -AsSecureString

# Чтение из переменной
$PlainPassword = &amp;quot;P@ssw0rd&amp;quot;
$SecurePassword = $PlainPassword | ConvertTo-SecureString -AsPlainText -Force&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Создание PSCredentials&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$UserName = &amp;quot;Domain\User&amp;quot;
$Credentials = New-Object System.Management.Automation.PSCredential `
     -ArgumentList $UserName, $SecurePassword&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Получение пароля из PSCredentials&lt;/h2&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$PlainPassword = $Credentials.GetNetworkCredential().Password&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Получение пароля из SecureString&lt;/h2&gt;
&lt;p&gt;Можно создать PSCredentials и получить из них пароль, но есть и другой способ:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$BSTR = `
    [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Лучшие подходы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Старайтесь не спрашивать у пользователя пароль, а по максимуму используйте Windows authentication.&lt;/li&gt;
&lt;li&gt;Никогда не держите пароли в чистом виде, только в SecureString или PSCredentials&lt;/li&gt;
&lt;li&gt;Если вам нужно запросить учетные данные у пользователя, используйте командлет Get-Credential. Он использует стандартную функцию Windows для последовательного и безопасного получения пароля без сохранения его в памяти в виде открытого текста.&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>


</channel>
</rss>