Я оцениваю Windows PowerShell как замену cmd.exe для базовой автоматизации процессов для кода командной строки (например, установка, выполнение и пост-обработка большого числа заданий Fortran). Я знаю достаточно Perl и shell для что я хочу, но я стараюсь оставаться в инструментальной цепочке Windows, вместо того, чтобы тренировать своих сотрудников на Perl, Python, Ruby, Cygwin и т.д. Я работаю в инженерной фирме, поэтому нам не нужно .NET или обширные рамки для разработки Windows. Короче говоря: мы хрустем много номеров с внутренним кодом, и мне нужны разумные средства автоматизации повторяющихся ручных задач.
Проблема в том, что у меня возникли проблемы с оценкой языка, потому что я не могу найти краткое руководство по использованию языка для PowerShell,
Мне очень интересно найти M в RTFM, но обратите внимание, что я на этапе оценки, так что я потерял 50 долларов или около того от Microsoft Press (который в 2010 году был бы основным источником редактирования, печатная документация) является не стартером.
Ответ 2
Внутренние функции
Не работает функция. Собственные команды PowerShell называются командлетами - они являются классами .NET, имеют общую систему параметров/аргументов и хорошо работают с конвейером. Теперь вы можете сделать то же самое с расширенными функциями непосредственно на языке PowerShell.
Существует множество встроенных командлетов для ввода-вывода файлов, управления процессом, доступа WMI и материалов, относящихся к оболочке, таких как управление переменными, псевдонимами, модулями и с.
Кроме того, в вашем распоряжении полная платформа .NET, где вы можете найти различные математические функции, например, и все остальное, что нелегко сделать с помощью PowerShell.
Основные функции проверки/ветвления/цикла и управления потоком
Обычные С-подобные утверждения: if
, switch
, for
, while
, do
, foreach
. Обратите внимание, что фигурные скобки разделяют блоки, и все эти утверждения ожидают блоки (не блоки или один оператор, как на многих других языках). Детали можно найти с помощью Get-Help about_If
(и about_Switch
, about_for
, about_while
, about_do
, about_foreach
). Особенно switch
безумно силен, позволяя регулярное сопоставление выражений и другие тонкости, которые часто могут служить простым импровизированным парсером.
Внутренние типы переменных (логические, целые, с плавающей запятой, строка)
Assign $true
or $false
to a variable and it is a boolean, assign an integer to a variable and it becomes Int32
, Int64
, Decimal
or Double
, depending on how large it is. You won't surprisingly land at −231 because of overflow. Floating point numbers and strings can be similarly constructed with the usual notation. You can always declare an explicit type if you don't like the default choice:
PS> [long]$a = 5 # 5 would usually result in [int], not [long]
Внутренние структуры данных (скаляр, список, ассоциативный массив, объект)
Вы можете легко иметь скаляры:
PS> $a = "foo"
или списки (ну, они представляют собой массивы внизу):
PS> $b = 5, 2, "bar"
или хэш-таблицы (ассоциативные массивы):
PS> $c = @{ 'a' = 5; 7 = 'foo' }
Оба массива и хэш-таблицы по умолчанию основаны на Object
. Чтобы получить более сильные ограничения типа здесь, вам нужно перепрыгнуть через несколько обручей.
Операторы и приоритет оператора
Операторы можно найти в Get-Help about_Operators
.
Арифметика (см. about_arithmetic_operators
)
+ - * / % ++ --
Назначение (см. about_assignment operators
)
= += -= *= /= %=
Логический (см. about_logical_operators
)
-and -or -xor -not !
Довольно просто; !
- это просто другое имя для -not
, которое может помочь тем, кто внедрен в C-подобные языки.
побитовое
-band -bor -bxor -bnot
Операторы сравнения
Так как PowerShell является оболочкой, они не могут просто использовать >
и <
, которые зарезервированы для перенаправления, следовательно, несколько более громоздкие варианты:
-lt -le -eq -ge -gt -ne
Другие
Есть также два варианта операторов сопоставления строк: -match
для соответствия регулярных выражений и -like
для сопоставления подстановочных знаков; их отрицательные варианты: -notmatch
, -notlike
; и их явно чувствительные к регистру и нечувствительные к регистру двоюродные братья (по умолчанию не чувствительны к регистру): -cmatch
, -imatch
, -cnotmatch
, -inotmatch
, -clike
, -ilike
, -cnotlike
, -inotlike
, См. about_comparison_operators
)
Тогда есть еще несколько специальных операторов, таких как операторы перенаправления (см. about_redirection
):
> >> 2> 2>> 2>&1
Split и Join (новый в PowerShell v2):
-split -join
Те могут разделить строку на регулярное выражение или присоединиться к массиву с указанным разделителем.
Оператор замены -replace
, который также допускает регулярные выражения.
Оператор формата -f
:
PS> "{0:N3} {1} {2:yyyy-MM-dd}" -f 123.456789,"foo",(Get-Date)
123,457 foo 2010-02-25
Оператор диапазона ..
:
PS> 1..10 -join ", "
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Помимо множества других, таких как оператор вызова &
, точечный поиск с .
, подвыражениями с $( )
, подвыражениями массива с @( )
и оператором построения массива ,
. Однако это выходит из-под контроля, поэтому посмотрите сами.
Что касается приоритета, я сомневаюсь в том, что вам действительно нужно знать. Если есть сомнения, используйте круглые скобки. Арифметические операторы используют обычное правило (mul/div до add/sub). У меня не было особых сюрпризов с приоритетом, поэтому я не стал смотреть на него до сих пор.
Функции, специфичные для языка автоматизации задач
-
Управление процессом (exec, fork, wait, kill)
Это оболочка, поэтому exec
явно подразумевается. Вы можете напрямую запускать другие программы без проблем. fork
- это не Windows, поэтому вам не повезло. Для wait
существует Wait-Process
, который, как я считаю, делает то же самое (если я правильно читаю manpage).
-
Мониторинг системы (ps, время безотказной работы, lsof, fuser, netstat, df)
-
ps
является псевдонимом Get-Process
.
-
Время безотказной работы системы может быть запрошено через WMI и при необходимости упаковано в удобной функции:
function Get-SystemUptime
{
$os = Get-WmiObject Win32_OperatingSystem
(Get-Date) - [Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootUpTime)
}
который возвращает объект TimeSpan
.
-
lsof
, fuser
можно каким-то образом схватить из объектов процесса; Однако этого не делал. netstat
по-прежнему доступен как собственная программа, которую вы можете просто запустить.
-
df
может быть эмулирован с помощью
Get-PSDrive -PSProvider FileSystem
Если вам это нужно больше, чем просто посмотреть на него, WMI, вероятно, более разумный путь.
-
Обработка файлов и каталогов (поиск, поиск, которые, cd, mkdir, touch, rm, rmdir)
-
find
и locate
обычно можно достичь с помощью Get-ChildItem
и последующей фильтрации результатов с помощью Where-Object
.
-
which
сопоставляется с Get-Command
, который с PowerShell v2 отображает команды в том порядке, в котором они рассматриваются для выполнения:
PS Home:\> gcm where
CommandType Name Definition
----------- ---- ----------
Alias where Where-Object
Application where.exe C:\Windows\system32\where.exe
-
cd
является псевдонимом для Set-Location
. Возможные местоположения включают не только файловую систему, но и реестр, переменные, псевдонимы, хранилище сертификатов и т.д.
-
mkdir
- это функция, которая в конечном итоге сопоставляется с New-Item
с соответствующими аргументами.
-
touch
может быть достигнуто с помощью Set-ItemProperty
:
Set-ItemProperty foo.txt LastWriteTime (Get-Date)
Вы можете поместить это в функцию с именем touch
, если хотите.
-
rm
и rmdir
являются псевдонимами для Remove-Item
.
-
I/O (трубы, cat, tee, xargs, чтение, запись, перезапись, добавление, поиск)
- Трубопроводы используют объекты вместо байтов, которые должны быть самыми значительными по сравнению с другими оболочками. Кроме того, не слишком много сюрпризов. Многие командлеты принимают ввод конвейера.
-
cat
является псевдонимом для Get-Content
.
-
tee
является псевдонимом для Tee-Object
. Это не только позволяет записывать в файл, но вы также можете записывать его в переменную, например:
Get-Process
| Tee-Object -Variable proc
| Select-Object ProcessName,CPU
-
xargs
можно заменить на ForEach-Object
, насколько я могу видеть.
- Байт-ориентированный ввод/вывод файлов, вероятно, лучше выполняется с обычными объектами .NET и вызовами методов. Достаточно легко получить полный файл в виде строки с
Get-Content
, но помимо этого это немного громоздко.
-
Функции обработки текста (awk, sed, grep, split, join, cut, fmt, string)
Большинство функций обработки текста не так отчаянно необходимы, как в UNIX-системах, поскольку вам не нужны они, например, для анализа вывода команды, по крайней мере, когда вы имеете дело с командлетами, которые возвращают объекты, которые позволяют намного проще доступ к их свойствам.
Помимо этого существуют различные инструменты для обработки текста. В зависимости от того, что вам нужно сделать switch -regex
и -match
, -replace
и -split
операторы могут компенсировать большинство применений sed
, awk
, cut
, split
, join
Я видел.
Нет strings
или fmt
.
Является ли PowerShell строго типизированным (char, строка, int, long, float, double) или слабо типизированный (вариант)?
PowerShell использует систему типа .NET. Переменные неявно строго напечатаны, но не объявлены. Тем не менее, они могут иметь явный тип.
Доступны ли общие структуры данных (скалярные, список, ассоциативный массив) и являются ли они первоклассными элементами?
Таким образом, вы можете использовать любую структуру данных .NET из пространства имен System.Collections
. Общие коллекции немного болезненны для настройки, но это можно сделать. Как упоминалось ранее, списки элементов и хэш-таблиц также являются языковыми элементами.
Есть ли библиотека или система модулей?
В PowerShell v2 есть модули, которые являются наборами командлетов связанной функциональности. Подробнее см. Get-Help about_Modules
.
Если да, то что находится в стандартной библиотеке?
Больше, чем было бы разумно описать здесь. Вы можете позвонить Get-Command
, чтобы узнать, что доступно. Get-Help
, как обычно, помогает выяснить, что делает какая-либо данная вещь.
Есть ли сторонние библиотеки, которые я могу использовать, если я не найду то, что мне нужно?
Вы можете динамически загружать любую сборку .Net, используя
[System.Reflection.Assembly]::LoadFrom(...)
или (в PowerShell v2) с помощью Add-Type
:
Add-Type -AssemblyName ...
Является ли это процедурным, функциональным или объектно-ориентированным языком или в какой степени каждый?
Wikipedia говорит, что Multi-парадигма: императив, конвейер, объектно-ориентированный, функциональный, отражающий. Аспект контура объекта - прекрасный способ добиться элегантных решений для некоторых проблемных областей.
Он объектно-ориентированный в том смысле, что вы в основном используете объекты для достижения своей цели, вы редко моделируете что-то с объектами в PowerShell. Вы не можете создавать собственные классы (не считая Add-Type
, который позволяет вам писать, компилировать и импортировать код С# или VB на лету), поэтому с точки зрения абстракции для собственной работы на языке PowerShell вы, вероятно, будете больше на процедурный уровень.
Каковы соглашения о кодировании? (Perl Best Practices)
Язык еще очень молод, так что еще нет такой вещи (по крайней мере, я не знаю об этом). Однако при попытке кодирования кода PowerShell Code-Golf стало очевидным, что трудно создавать совершенно нечитаемые беспорядки. Обычные правила для языков курчавого языка работают достаточно хорошо, и для более длинных конвейеров, разбивающих их на несколько строк, часто помогает читаемость.
Есть ли ожидания форматирования - линейная или свободная форма?
Не уверен, как ответить на это: в основном строки, ориентированные на команды, но с помощью команд с каналами, могут быть лучше прочитаны с каждой командой в одной строке.
Если вы вызываете встроенный, вы можете использовать `(серьезный акцент) как знак продолжения строки.
Значит ли это пробел или регистр?
Нет. За исключением разрывов строк, которые обычно завершают команду, если только предшествующий символ эвакуации или когда они происходят внутри блоков или других окружающих структур.
Есть ли ограничение набора символов?
Нет.
Является ли язык "8-битным чистым"?
Да. Мы больше не находимся в возрасте Ye Olde 70-х. Вы также можете легко назвать переменные, функции, которые вы хотите, без ограничений. Например, я назвал функцию ♦
(U + 0004), которая позволяет мне нажать Ctrl + D, Enter, чтобы закрыть сеанс.
Поддерживает ли он UTF-8, Unicode и т.д.?
Поскольку PowerShell использует .Net, у вас есть полная поддержка Unicode. Потоки ввода и вывода могут быть настроены на различные кодировки.