Ознакомьтесь с нашей политикой обработки персональных данных
15:22 

Простые вещи с Powershell

https
Those wings... I want them too.
Powershell - это такая командная оболочка в современных версиях винды. Входит в её состав начиная с Windows 7, на XP ставится отдельно. Базируется на .Net Framework и предоставляет более широкие возможности, чем стандартная cmd. У меня на работе окошко powershell-а запущенно постоянно, потому что позволяет быстро что-то рассчитать, сгенерировать или проверить, выполнить всякие администраторские вещи на компьютере. Примеры таких простых действий мне и захотелось привести: может что-то из них покажется кому-то полезным, может даст базовое представление об этом языке или вообще программерстве в целом.

Иконка Powershell выглядит вот так:


Располагаться она должна где-то в районе раздела "Стандартные" в меню "Пуск". Однако же если найти совсем нигде не удаётся, то запустить консоль можно, например, нажав клавишу Win + R и введя в появившемся окне powershell.exe

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

1. Подсчитать длину строки.
Строка в PS представляет собой последовательность символов, заключённую в одинарные или двойные кавычки. У любого объекта строки есть набор свойств и методов, доступ к которым можно получить, поставив после этого объекта точку. Например, для данного случая есть свойство Length:

PS C:\> "Однажду в cтудёную зимнюю пору я из лесу вышел...".Length
49

C большими текстами, однако, не выйдет: консоль имеет ограничение по длине вставляемого текста. Можно конечно сохранить его в *.txt (но не *.doc) файл, считать содержимое и уже у него запросить длину... Однако конструкция выйдет уже сложнее. Что-то вроде

PS C:\> [io.file]::ReadAllText((Resolve-Path ".\fanfic.txt")).Length
72872

Посчитать же количество слов в тексте на PS - дело и вовсе зубодробительное.
PS C:\> $content = [io.file]::ReadAllText((Resolve-Path ".\fanfic.txt")).ToCharArray()
PS C:\> $lettersAndSpaces = $content | ? {([char]::IsLetter($_)) -or ($_ -eq [char]" ")}
PS C:\> (-join $lettersAndSpaces).Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries).Length
10392

2. Сгенерировать строчку
Предположим, хочется в чатике вставить длиннющее "хахаха", а набивать руками лень. В PS оно генерируется легко и просто:

PS C:\> "ха" * 50
хахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахахах
ахахахахахахахахахаха

3. Скопировать строчку в буфер обмена
Как в любой консоли, в PS есть возможности копирования мышкой. Но иногда быстрее набрать с клавиатуры «| clip» - и предшествующее значение окажется в буфере обмена, терпеливо дожидаясь всем знакомого Ctrl + V.

PS C:\> "!" * 200 | clip

4. Произвести вычисления в килобайтах/мегабайтах/гигабайтах/терабайтах
В PS встроена поддержка рассчётов с указанными единицами измерений. Чтобы их провести достаточно воспользоваться предопределёнными суффиксами: KB, MB, GB, TB. Если в подобном выражении у числа суффикс не указан, PS считает, что речь идёт о байтах.

PS C:\> 1KB
1024

PS C:\> 1TB / 1MB
1048576

PS C:\> 123456/ 1KB
120,5625

PS C:\> 137 * 1GB / 1MB
140288

5. Провести рассчёты с датами
В Windows, безусловно, есть календарь и его для большинства случаев достаточно. Но что, если хочется странного, например, узнать, какой на какой день недели выпадет Новый Год в 2057 году? Это сколько же листать придётся?
В PS есть встроенный тип [datetime], который легко преобразовывается из строкового представления. И у объектов данного типа, естественно, есть много полезных свойств и методов.

PS C:\> ([datetime]"01.01.2057").DayOfWeek
Monday

Строчки парсятся из самых разных форматов, однако есть одно "но": Powershell - произведение иностранное, а на западе, как известно, принято вначале писать месяц, а потом день, а не наоборот, как у нас.

PS C:\> [datetime]"02-01-2057"

1 февраля 2057 г. 0:00:00

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

У типа данных [datetime] есть свойство now - текущий момент времени; объекты времён можно вычитать друг из друга при помощи знака "минус".
Например, вот так можно узнать, сколько же дней осталось до Международного Женского дня:

PS C:\> ([datetime]"03.08.2015" - [datetime]::now).Days
16

К объекту datetime так же можно прибавлять временные промежутки, при помощи целого набора методов AddDays/AddHours/AddMinutes/AddMonths. Скажем, чтобы рассчитать дату, на которую выпадает в этом (2015-м) году День Программиста можно сделать так:

PS C:\> ([datetime]"01.01.2015").AddDays(256 - 1)

13 сентября 2015 г. 0:00:00

6. Получить имя компьютера и другую информацию об окружении
В PS есть переменная $env, содержащая различную информацию о параметрах окружения. В частности, получить через неё имя компьютера можно так:

PS C:\> $env:computername
DVP-VAIO

Вывести список всего её содержимого можно так:

PS C:\> dir env:\

Name Value
---- -----
ALLUSERSPROFILE     C:\ProgramData
asl.log                     Destination=file
CLASSPATH         .;C:\PROGRA~2\IBM\IBMDAT~1\java\db2jcc.jar;C:...
...

7. Найти нужный процесс

Процессы, безусловно, видны в TaskManager. И там же можно отсортировать их по имени, чтобы было удобно искать требуемый. Но что если целиком название процесса не известно, только его часть? В PS это можно сделать так:

PS C:\> Get-Process *pad*

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
60 7 1952 6080 71 0,16 7964 notepad
117 15 9824 16524 110 0,86 4736 notepad++

8. Сгенерировать GUID
PS C:\> [guid]::NewGuid()

Guid
----
78ccb35a-b91f-4fc4-bdf5-d0e431f68864

9. Преобразования в/из xml и работа с полученным объетом

PS C:\> $xml = [xml]"<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"
PS C:\> $xml.note.from
Jani

PS C:\> $xml.note.from = "Janiffer"
PS C:\> $xml.OuterXml
<note><to>Tove</to><from>Janiffer</from><heading>Reminder</heading><body>Don'tforget me this weekend!</body></note>

В версиях, начиная с 3.0 есть так же команды для работы с JSON: ConvertFrom-Json и ConverTo-Json. Но у меня тут стоит, увы, устаревшая версия :shuffle: так что я их только упомяну.

@темы: Программирование

URL
Комментарии
2015-02-19 в 18:10 

Leon PRO
Мудрый Зомбайн
Молодец! Отправляй на хабр :)

2015-02-19 в 21:12 

https
Those wings... I want them too.
Leon PRO, Чёт я чувствую меня на хабре с этим заклюют :) Оно с прицелом на другую аудиторию писалось. Или ты тоже троллишь так? :eyebrow:

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

URL
   

Вне реального мира

главная