Сценарий powershell примеры

Powershell скрипты. Статья по основам скриптописания в Powershell. Разобраны основы на очень доступном языке.

Доброго времени суток дорогие читатели. В данной статье мы познакомимся с основами Powershell. Данный язык программирования используется во всех ОС Microsoft начиная с Windows XP SP3. Писать Powershell скрипты должен уметь каждый уважающий себя системный администратор windows.

Все команды в Powershell как правило используются в форме командлетов. Все командлеты это специализированные классы .NET Framework и .NET Core (используется в PowerShell Core 6 и выше).

Powershell класса .NET Framework это версии с 1 по 5.1 а Powershell .NET Core это версия 6 и выше (на данный момент 7.0). По заявлению Microsoft новых функций в Powershell 5.1 (.NET Framework) вносить уже не будут. Однако 7 версия еще не полностью поддерживает все модули предыдущих версий. Но судя по всему Microsoft стремится к этому и скоро версия Core будет единственной. В общем cmd отходит в прошлое и теперь без Powershell никуда. Давайте приступим к практике. Так всегда лучше запоминается материал.

Запуск Powershell

На примере Windows 10 Powershell можно запустить просто нажав правой кнопкой мыши на меню пуск.

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

Еще можно воспользоваться поиском в WIndows 10 и ввести название powershell

Как видно на картинке выше нашелся не только Powershell но и Powershell ISE. Консоль powershell удобна если требуется запустить последовательно не больше одной команды. Либо несколько команд в конвейере. Однако в случае написания полноценных скриптов лучше использовать Powershell ISE. Это бесплатная среда разработки сценариев на языке Powershell поставляется вместе с ОС Windows.

Окно Powershell
Окно Powershell ISE

Сразу после запуска консоли рекомендую запустить командлет Get-Help — встроенная справка по всем командлетам, аналог man в Linux.

Get-Help

Видим что консоль предлагает обновить встроенную помощь. Нажимаем Y и соглашаемся.

Командлеты

Командлеты — это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help — получить помощь. Обычно Get используется чтобы получить информация, Set — внести изменение, New — создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.

Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково.

Чтобы получить список всех доступных командлетов необходимо использовать Get-Command

Get-Command

Для получения справки по любому командлету напишите Get-Help имя-комндлета. Например

Давайте представим что нам необходимо вывести список командлетов для управления процессами. Воспользуемся Get-Command и укажем ему параметры для более точного поиска.

Get-Command *Process*

И вот мы видим список командлетов позволяющих управлять процессами: Get-Process — список всех запущенных процессов, Start-Process — запустить указанный процесс, Stop-Process— остановить указанный процесс, Wait-Process — ожидать указанный процесс. Как видно из названий командлетов можно легко понять для чего каждый служит.

Используя командлет Get-Help можно получить справку по любому командлету.

PS C:WINDOWSsystem32> Get-Help Get-Process

ИМЯ
    Get-Process

ОПИСАНИЕ
    Gets the processes that are running on the local computer or a remote computer.


СИНТАКСИС
    Get-Process [[-Name] <System.String[]>] [-ComputerName <System.String[]>] [-FileVersionInfo] [-Module] [<CommonParameters>]

    Get-Process [-ComputerName <System.String[]>] [-FileVersionInfo] -Id <System.Int32[]> [-Module] [<CommonParameters>]

    Get-Process [-ComputerName <System.String[]>] [-FileVersionInfo] -InputObject <System.Diagnostics.Process[]> [-Module] [<Com
    monParameters>]

    Get-Process -Id <System.Int32[]> -IncludeUserName [<CommonParameters>]

    Get-Process [[-Name] <System.String[]>] -IncludeUserName [<CommonParameters>]

    Get-Process -IncludeUserName -InputObject <System.Diagnostics.Process[]> [<CommonParameters>]


ОПИСАНИЕ
    The `Get-Process` cmdlet gets the processes on a local or remote computer.

    Without parameters, this cmdlet gets all of the processes on the local computer. You can also specify a particular process b
    y process name or process ID (PID) or pass a process object through the pipeline to this cmdlet.

    By default, this cmdlet returns a process object that has detailed information about the process and supports methods that l
    et you start and stop the process. You can also use the parameters of the `Get-Process` cmdlet to get file version informati
    on for the program that runs in the process and to get the modules that the process loaded.


ССЫЛКИ ПО ТЕМЕ
    Online Version: https://docs.microsoft.com/powershell/module/microsoft.powershell.management/get-process?view=powershell-5.1
    &WT.mc_id=ps-gethelp
    Debug-Process
    Get-Process
    Start-Process
    Stop-Process
    Wait-Process

ЗАМЕЧАНИЯ
    Для просмотра примеров введите: "get-help Get-Process -examples".
    Для получения дополнительных сведений введите: "get-help Get-Process -detailed".
    Для получения технических сведений введите: "get-help Get-Process -full".
    Для получения справки в Интернете введите: "get-help Get-Process -online"

При использовании командлета есть возможность указать несколько параметров при запуске. Первый параметр можно не называть. Выше я писал Get-Command *Process* где указал поиск командлетов со словом Process. Однако я не написал параметр -Name, хотя именно его и указал. Если полностью то поиск по имени выглядит так: Get-Command -Name *Process* . В случае отсутствия непосредственного указания -Name Powershell принимает в качестве имени введенное слово *Process*.

Давайте выведем список процессов с именем WhatsApp

Get-Process -Name WhatsApp -IncludeUserName
Get-Process

Мы вывели все процессы с именем WhatsApp и добавили в вывод дополнительный параметр -IncludeUserName, что позволило нам увидеть кем запущен процесс.

Алиасы

Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process.

Список всех alias можно получить используя командлет Get-Alias

PS C:WINDOWSsystem32> get-alias

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
Alias           cat -> Get-Content
Alias           cd -> Set-Location
Alias           CFS -> ConvertFrom-String                          3.1.0.0    Microsoft.PowerShell.Utility
Alias           chdir -> Set-Location
Alias           clc -> Clear-Content
Alias           clear -> Clear-Host
Alias           clhy -> Clear-History
Alias           cli -> Clear-Item
Alias           clp -> Clear-ItemProperty
Alias           cls -> Clear-Host
Alias           clv -> Clear-Variable
Alias           cnsn -> Connect-PSSession
Alias           compare -> Compare-Object
Alias           copy -> Copy-Item
Alias           cp -> Copy-Item
Alias           cpi -> Copy-Item
Alias           cpp -> Copy-ItemProperty
Alias           curl -> Invoke-WebRequest
Alias           cvpa -> Convert-Path
Alias           dbp -> Disable-PSBreakpoint
Alias           del -> Remove-Item
Alias           diff -> Compare-Object
Alias           dir -> Get-ChildItem
Alias           dnsn -> Disconnect-PSSession
Alias           ebp -> Enable-PSBreakpoint
Alias           echo -> Write-Output
Alias           epal -> Export-Alias
Alias           epcsv -> Export-Csv
Alias           epsn -> Export-PSSession
Alias           erase -> Remove-Item
Alias           etsn -> Enter-PSSession
Alias           exsn -> Exit-PSSession
Alias           fc -> Format-Custom
Alias           fhx -> Format-Hex                                  3.1.0.0    Microsoft.PowerShell.Utility
Alias           fl -> Format-List
Alias           foreach -> ForEach-Object
Alias           ft -> Format-Table
Alias           fw -> Format-Wide
Alias           gal -> Get-Alias
Alias           gbp -> Get-PSBreakpoint
Alias           gc -> Get-Content
Alias           gcb -> Get-Clipboard                               3.1.0.0    Microsoft.PowerShell.Management
Alias           gci -> Get-ChildItem
Alias           gcm -> Get-Command
Alias           gcs -> Get-PSCallStack
Alias           gdr -> Get-PSDrive
Alias           ghy -> Get-History
Alias           gi -> Get-Item
Alias           gin -> Get-ComputerInfo                            3.1.0.0    Microsoft.PowerShell.Management
Alias           gjb -> Get-Job
Alias           gl -> Get-Location
Alias           gm -> Get-Member
Alias           gmo -> Get-Module
Alias           gp -> Get-ItemProperty
Alias           gps -> Get-Process
Alias           gpv -> Get-ItemPropertyValue
Alias           group -> Group-Object
Alias           gsn -> Get-PSSession
Alias           gsnp -> Get-PSSnapin
Alias           gsv -> Get-Service
Alias           gtz -> Get-TimeZone                                3.1.0.0    Microsoft.PowerShell.Management
Alias           gu -> Get-Unique
Alias           gv -> Get-Variable
Alias           gwmi -> Get-WmiObject
Alias           h -> Get-History
Alias           history -> Get-History
Alias           icm -> Invoke-Command
Alias           iex -> Invoke-Expression
Alias           ihy -> Invoke-History
Alias           ii -> Invoke-Item
Alias           ipal -> Import-Alias
Alias           ipcsv -> Import-Csv
Alias           ipmo -> Import-Module
Alias           ipsn -> Import-PSSession
Alias           irm -> Invoke-RestMethod
Alias           ise -> powershell_ise.exe
Alias           iwmi -> Invoke-WmiMethod
Alias           iwr -> Invoke-WebRequest
Alias           kill -> Stop-Process
Alias           lp -> Out-Printer
Alias           ls -> Get-ChildItem
Alias           man -> help
Alias           md -> mkdir
Alias           measure -> Measure-Object
Alias           mi -> Move-Item
Alias           mount -> New-PSDrive
Alias           move -> Move-Item
Alias           mp -> Move-ItemProperty
Alias           mv -> Move-Item
Alias           nal -> New-Alias
Alias           ndr -> New-PSDrive
Alias           ni -> New-Item
Alias           nmo -> New-Module
Alias           npssc -> New-PSSessionConfigurationFile
Alias           nsn -> New-PSSession
Alias           nv -> New-Variable
Alias           ogv -> Out-GridView
Alias           oh -> Out-Host
Alias           popd -> Pop-Location
Alias           ps -> Get-Process
Alias           pushd -> Push-Location
Alias           pwd -> Get-Location
Alias           r -> Invoke-History
Alias           rbp -> Remove-PSBreakpoint
Alias           rcjb -> Receive-Job
Alias           rcsn -> Receive-PSSession
Alias           rd -> Remove-Item
Alias           rdr -> Remove-PSDrive
Alias           ren -> Rename-Item
Alias           ri -> Remove-Item
Alias           rjb -> Remove-Job
Alias           rm -> Remove-Item
Alias           rmdir -> Remove-Item
Alias           rmo -> Remove-Module
Alias           rni -> Rename-Item
Alias           rnp -> Rename-ItemProperty
Alias           rp -> Remove-ItemProperty
Alias           rsn -> Remove-PSSession
Alias           rsnp -> Remove-PSSnapin
Alias           rujb -> Resume-Job
Alias           rv -> Remove-Variable
Alias           rvpa -> Resolve-Path
Alias           rwmi -> Remove-WmiObject
Alias           sajb -> Start-Job
Alias           sal -> Set-Alias
Alias           saps -> Start-Process
Alias           sasv -> Start-Service
Alias           sbp -> Set-PSBreakpoint
Alias           sc -> Set-Content
Alias           scb -> Set-Clipboard                               3.1.0.0    Microsoft.PowerShell.Management
Alias           select -> Select-Object
Alias           set -> Set-Variable
Alias           shcm -> Show-Command
Alias           si -> Set-Item
Alias           sl -> Set-Location
Alias           sleep -> Start-Sleep
Alias           sls -> Select-String
Alias           sort -> Sort-Object
Alias           sp -> Set-ItemProperty
Alias           spjb -> Stop-Job
Alias           spps -> Stop-Process
Alias           spsv -> Stop-Service
Alias           start -> Start-Process
Alias           stz -> Set-TimeZone                                3.1.0.0    Microsoft.PowerShell.Management
Alias           sujb -> Suspend-Job
Alias           sv -> Set-Variable
Alias           swmi -> Set-WmiInstance
Alias           tee -> Tee-Object
Alias           trcm -> Trace-Command
Alias           type -> Get-Content
Alias           wget -> Invoke-WebRequest
Alias           where -> Where-Object
Alias           wjb -> Wait-Job
Alias           write -> Write-Output

Как видно из списка для alias использованы аналогичные по значению команды из Linux: ls, man, mount, md, kill и т.п. Видимо чтобы линуксоиду было по привычнее 🙂 Можно создать свой alias используя командлет New-Alias

Конвейер

Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. Ничего непонятно? 🙂 Давайте на примерах, так всегда яснее.

Возьмем уже известный нам командлет Get-Process, посмотрим на его вывод

Get-Process

Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.

Get-Process|Select-Object ID,CPU,ProcessName
Get-Process|Sort-Object

Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл

Get-Process|Select-Object ID,CPU,ProcessName|Out-File C:TMPout.txt

Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.

Структура объектов

В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member

Get-Process|get-Member

Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process

Давайте посмотрим тип данных у новой переменной

$new="Test"
$new|Get-Member
Get-Member String

В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.

Get-Member methods

Как видно на картинке выше мы заключаем нашу тестовую переменную $new в скобки и после них пишем точку и указываем метод. В примере я использовал три метода:

  • ToUpper — перевод всех букв в строке в верхний регистр
  • ToLower — перевод всех букв в строке в нижний регистр
  • Length — подсчитать количество символов в строке

Это всего лишь небольшой пример что можно сделать с параметрами объекта. Чаще используйте Get-Member и вы откроете для себя безграничные возможности манипуляции над объектами.

Скрипты Powershell

В самом начале статьи указал на встроенный инструмент Powershell ISE. Давайте запустим его и создадим свой первый скрипт. Кстати скрипты сохраняются в файлах с расширением ps1

Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда запущен, т.к. мы вначале скрипта написали Start-Process notepad

Start-Process notepad
$a=Get-Process notepad
if ($a.ProcessName -like "Notepad")
{
Write-Host "Блокнот запущен, давайте его закроем"
Stop-Process -name notepad
}
else 
{
Write-Host "Блокнот не запущен, что поделать"
}
Powershell скрипты

В этом скрипте я использовал цикл if else. О циклах будет подробнее в следующей статье. Итак давайте сохраним скрипт и выполним его.

В ответ мы получим такую ошибку:

Невозможно загрузить файл, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см.
 about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/?LinkID=1351
70.
    + CategoryInfo          : Ошибка безопасности: (:) [], ParentContainsError 
   RecordException
    + FullyQualifiedErrorId : UnauthorizedAccess

Все верно, изначально в WIndows запрещено выполнять скрипты Powershell. Это сделано для повышения безопасности системы. Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров:

  • Restricted — политика по умолчанию. Выполнение всех скриптов запрещено
  • RemoteSigned — разрешено запускать собственные скрипты и подписанные доверенным разработчиком
  • AllSigned — разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение
  • Unrestricted — в системе разрешается запускать любые скрипты

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

Set-ExecutionPolicy -Unrestricted
Set-ExecutionPolicy

Будет предупреждение по безопасности, соглашаемся нажав Y

Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy

Get-ExecutionPolicy

В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного 😉

Рекомендую к прочтению:
  • Переменные
  • Операторы сравнения
  • Операторы условий
  • Циклы
Хотите отблагодарить автора статьи? Это даст ему дополнительный стимул к написанию новых статей.

Mega Collection of PowerShell Scripts

This repo provides 500+ useful and cross-platform PowerShell scripts in the 📂Scripts subfolder — for command-line interface (CLI) usage, for remote control (via SSH), by context menu, by voice (e.g. talk2windows), by automation software (e.g. Jenkins), automatically on login/logoff/daily/etc., or simply to learn PowerShell.

Download | FAQ | Note: the scripts support Unicode — a modern console is recommended (e.g. Windows Terminal)

🔊 Scripts for Audio & Voice

Script Description
list-voices.ps1 Lists the installed text-to-speech voices. Read more…
play-beep-sound.ps1 Plays a short beep sound. Read more…
play-files.ps1 Plays the given audio files. Read more…
play-happy-birthday.ps1 Plays the Happy Birthday song. Read more…
play-imperial-march.ps1 Plays the Imperial March (Star Wars). Read more…
play-jingle-bells.ps1 Plays Jingle Bells. Read more…
play-mission-impossible.ps1 Plays the Mission Impossible theme. Read more…
play-m3u.ps1 Plays the given playlist (M3U file format). Read more…
play-mp3.ps1 Plays the given sound file (MP3 file format). Read more…
play-super-mario.ps1 Plays the Super Mario intro. Read more…
play-tetris-melody.ps1 Plays the Tetris melody. Read more…
speak-checklist.ps1 Speaks the given checklist by text-to-speech. Read more…
speak-countdown.ps1 Starts a countdown by text-to-speech. Read more…
speak-english.ps1 Speaks text with an English text-to-speech voice. Read more…
speak-epub.ps1 Speaks the content of the given Epub file by text-to-speech. Read more…
speak-file.ps1 Speaks the content of the given text file by text-to-speech. Read more…
speak-french.ps1 Speaks text with a French text-to-speech voice. Read more…
speak-german.ps1 Speaks text with a German text-to-speech voice. Read more…
speak-italian.ps1 Speaks text with an Italian text-to-speech voice. Read more…
speak-spanish.ps1 Speaks text with a Spanish text-to-speech voice. Read more…
speak-test.ps1 Performs a speak test by text-to-speech. Read more…
speak-text.ps1 Speaks the given text by text-to-speech. Read more…
tell-joke.ps1 Tells a joke by text-to-speech. Read more…
tell-quote.ps1 Tells a quote by text-to-speech. Read more…
turn-volume-down.ps1 Turns the audio volume down. Read more…
turn-volume-fully-up.ps1 Turns the audio volume fully up. Read more…
turn-volume-off.ps1 Turns audio off. Read more…
turn-volume-on.ps1 Turns audio on. Read more…
turn-volume-up.ps1 Turns the audio volume up. Read more…

⚙️ Scripts to Manage Computers

Script Description
add-firewall-rules.ps1 Adds firewall rules for the given executables (needs admin rights). Read more…
check-cpu.ps1 Checks the CPU temperature. Read more…
check-dns.ps1 Checks the DNS resolution. Read more…
check-drive-space.ps1 Checks a drive for free space left. Read more…
check-file-system.ps1 Checks the file system of a drive (needs admin rights). Read more…
check-health.ps1 Checks the system health. Read more…
check-ping.ps1 Checks the ping latency to the internet. Read more…
check-swap-space.ps1 Checks the swap space for free space left. Read more…
check-windows-system-files.ps1 Checks the validity of the Windows system files (needs admin rights). Read more…
enable-crash-dumps.ps1 Enables the writing of crash dumps. Read more…
hibernate.ps1 Enables hibernate mode for the local computer (needs admin rights). Read more…
install-github-cli.ps1 Installs GitHub CLI. Read more…
install-chrome-browser.ps1 Installs the Google Chrome browser. Read more…
install-knot-resolver.ps1 Installs the Knot Resolver (needs admin rights). Read more…
install-ssh-client.ps1 Installs a SSH client (needs admin rights). Read more…
install-ssh-server.ps1 Installs a SSH server (needs admin rights). Read more…
install-signal-cli.ps1 Installs signal-cli from github.com/AsamK/signal-cli. Read more…
install-updates.ps1 Installs updates (need admin rights). Read more…
install-wsl.ps1 Installs Windows Subsystem for Linux (WSL), needs admin rights. Read more…
list-apps.ps1 Lists the installed applications. Read more…
list-cli-tools.ps1 Lists installed command-line interface (CLI) tools. Read more…
list-drives.ps1 Lists all drives. Read more…
list-network-shares.ps1 Lists all network shares of the local computer. Read more…
list-installed-software.ps1 Lists the installed software (except Windows Store apps). Read more…
list-printers.ps1 Lists all printer known to the computer. Read more…
list-print-jobs.ps1 Lists all jobs of all printers. Read more…
list-processes.ps1 Lists the local computer processes. Read more…
list-services.ps1 Lists the services on the local computer. Read more…
list-system-info.ps1 Lists system information on the local computer. Read more…
list-tasks.ps1 Lists all Windows scheduler tasks. Read more…
list-timezone.ps1 Lists the current time zone details. Read more…
list-timezones.ps1 Lists all time zones available. Read more…
list-user-groups.ps1 Lists the user groups on the local computer. Read more…
poweroff.ps1 Halts the local computer (needs admin rights). Read more…
query-smart-data.ps1 Queries the S.M.A.R.T. data of your HDD/SSD’s. Read more…
reboot.ps1 Reboots the local computer (needs admin rights). Read more…
remove-print-jobs.ps1 Removes all jobs from all printers. Read more…
restart-network-adapters.ps1 Restarts all local network adapters. Read more…
upgrade-ubuntu.ps1 Upgrades Ubuntu Linux to the latest (LTS) release. Read more…
wakeup.ps1 Sends a magic packet to a computer to wake him up. Read more…

💻 Scripts for the Desktop

Script Description Help
close-calculator.ps1 Closes the calculator application Help
close-cortana.ps1 Closes Cortana Help
close-chrome.ps1 Closes the Chrome browser Help
close-program.ps1 Closes the given program gracefully Help
close-edge.ps1 Closes the Edge browser Help
close-file-explorer.ps1 Closes Microsoft File Explorer Help
close-firefox.ps1 Closes the Firefox browser Help
close-microsoft-store.ps1 Closes the Microsoft Store app Help
close-netflix.ps1 Closes the Netflix app Help
close-onedrive.ps1 Closes Microsoft OneDrive Help
close-serenade.ps1 Closes the Serenade application Help
close-snipping-tool.ps1 Closes the Snipping Tool application Help
close-spotify.ps1 Closes Spotify Help
close-system-settings.ps1 Closes the System Settings window Help
close-task-manager.ps1 Closes the Task Manager Help
close-thunderbird.ps1 Closes Mozilla Thunderbird Help
close-vlc.ps1 Closes the VLC media player application Help
close-windows-terminal.ps1 Closes the Windows Terminal application Help
enable-god-mode.ps1 Enables the god mode (adds a new icon to the desktop) Help
list-clipboard.ps1 Lists the contents of the clipboard Help
new-email.ps1 Starts the default email client to write a new email Help
open-amazon-website.ps1 Opens Amazon’s website Help
open-default-browser.ps1 Launches the default Web browser Help
open-calculator.ps1 Starts the calculator program Help
open-c-drive.ps1 Opens the C: drive folder Help
open-downloads-folders.ps1 Opens the user’s downloads folder Help
open-dropbox-folder.ps1 Opens the user’s Dropbox folder Help
open-edge.ps1 Launches the Edge browser Help
open-email-client.ps1 Starts the default email client Help
open-facebook-website.ps1 Opens Facebook’s website Help
open-file-explorer.ps1 Opens the File Explorer Help
open-firefox.ps1 Launches the Firefox browser Help
open-fritz-box.ps1 Opens FRITZ!Box’s web interface Help
open-github.ps1 Opens GitHub’s website Help
open-google-contacts.ps1 Opens Google Contacts Help
open-google-earth.ps1 Opens Google Earth Help
open-google-mail.ps1 Opens Google Mail Help
open-google-maps.ps1 Opens Google Maps Help
open-google-news.ps1 Opens Google News Help
open-google-play.ps1 Opens Google Play Help
open-google-search.ps1 Opens Google Search Help
open-google-translate.ps1 Opens Google Translate Help
open-home-folder.ps1 Opens the user’s home folder Help
open-music-folder.ps1 Opens the user’s music folder Help
open-netflix.ps1 Starts the Netflix app Help
open-microsoft-store.ps1 Launches the Microsoft Store app Help
open-notepad.ps1 Starts the Notepad app Help
open-onedrive-folder.ps1 Opens the user’s OneDrive folder Help
open-pictures-folder.ps1 Opens the user’s pictures folder Help
open-recycle-bin.ps1 Opens the user’s recycle bin folder Help
open-repos-folder.ps1 Opens the user’s Git repositories folder Help
open-snipping-tool.ps1 Starts the Snipping Tool Help
open-speed-test.ps1 Opens Cloudflare’s speed test Help
open-spotify.ps1 Opens Spotify Help
open-system-settings.ps1 Opens system settings of Windows Help
open-task-manager.ps1 Starts the Task Manager Help
open-videos-folder.ps1 Opens the user’s videos folder Help
open-windows-terminal.ps1 Launches Windows Terminal Help
open-wikipedia-website.ps1 Opens Wikipedia’s website Help
open-youtube-website.ps1 Opens YouTube’s website Help
remind-me.ps1 Creates a scheduled task that will display a popup message Help
save-screenshot.ps1 Saves a single screenshot Help
set-wallpaper.ps1 Sets the given image as wallpaper Help

📁 Scripts for Files & Folders

Script Description Help
cd-autostart.ps1 Set the working directory to the user’s autostart folder Help
cd-desktop.ps1 Set the working directory to the user’s desktop folder Help
cd-docs.ps1 Set the working directory to the user’s documents folder Help
cd-downloads.ps1 Set the working directory to the user’s downloads folder Help
cd-dropbox.ps1 Set the working directory to the user’s Dropbox folder Help
cd-home.ps1 Set the working directory to the user’s home folder Help
cd-music.ps1 Set the working directory to the user’s music folder Help
cd-onedrive.ps1 Set the working directory to the user’s OneDrive folder Help
cd-pics.ps1 Set the working directory to the user’s pictures folder Help
cd-recycle-bin.ps1 Set the working directory to the user’s recycle bin folder Help
cd-repos.ps1 Change the working directory to the user’s Git repositories folder Help
cd-root.ps1 Set the working directory to the root directory (C: on Windows) Help
cd-scripts.ps1 Set the working directory to the PowerShell Scripts folder Help
cd-ssh.ps1 Set the working directory to the user’s SSH folder Help
cd-up.ps1 Set the working directory to one directory level up Help
cd-up2.ps1 Set the working directory to two directory levels up Help
cd-up3.ps1 Set the working directory to three directory levels up Help
cd-up4.ps1 Set the working directory to four directory levels up Help
cd-videos.ps1 Set the working directory to the user’s videos folder Help
check-symlinks.ps1 Checks every symlink in a directory tree Help
check-xml-file.ps1 Checks the given XML file for validity Help
clear-recycle-bin.ps1 Removes the content of the recycle bin folder (can not be undo!) Help
copy-photos-sorted.ps1 Copy image files sorted by year and month Help
decrypt-file.ps1 Decrypts the given file Help
download-dir.ps1 Downloads a directory tree from the given URL Help
download-file.ps1 Downloads a file from the given URL Help
edit.ps1 Edits the given file with the built-in text editor Help
encrypt-file.ps1 Encrypts the given file Help
get-md5.ps1 Prints the MD5 checksum of the given file Help
get-sha1.ps1 Prints the SHA1 checksum of the given file Help
get-sha256.ps1 Prints the SHA256 checksum of the given file Help
inspect-exe.ps1 Prints basic information of the given executable file Help
list-dir-tree.ps1 Lists the directory tree content Help
list-empty-dirs.ps1 Lists empty subfolders within the given directory tree Help
list-empty-files.ps1 Lists empty files within the given directory tree Help
list-files.ps1 Lists all files in the given folder and also in every subfolder Help
list-folder.ps1 Lists the folder content Help
list-hidden-files.ps1 Lists hidden files within the given directory tree Help
list-recycle-bin.ps1 Lists the content of the recycle bin folder Help
list-unused-files.ps1 Lists unused files in a directory tree Help
list-workdir.ps1 Lists the current working directory Help
make-install.ps1 Installs built executables and libs to the installation directory Help
new-shortcut.ps1 Creates a new shortcut file Help
new-symlink.ps1 Creates a new symbolic link file Help
new-zipfile.ps1 Creates a new .zip file from a directory Help
publish-to-ipfs.ps1 Publishes the given files or directory to IPFS Help
remove-empty-dirs.ps1 Removes empty subfolders within the given directory tree Help
replace-in-files.ps1 Search and replace a pattern in the given files by the replacement Help
search-filename.ps1 Searches the directory tree for filenames by given pattern Help
search-files.ps1 Searches the given pattern in the given files Help
upload-file.ps1 Uploads the local file to the given FTP server Help

♻️ Scripts to Convert Files

Script Description
convert-csv2txt.ps1 Converts a .CSV file to a text file. Read more…
convert-mysql2csv.ps1 Converts a MySQL database table to a .CSV file. Read more…
convert-ps2bat.ps1 Converts a PowerShell script to a Batch script. Read more…
convert-ps2md.ps1 Converts the comment-based help of a PowerShell script to Markdown. Read more…
convert-sql2csv.ps1 Converts a SQL database table to a .CSV file. Read more…
convert-txt2wav.ps1 Converts text to a .WAV audio file. Read more…
export-to-manuals.ps1 Exports all scripts as manuals. Read more…

📝 Scripts for Git

Script Description
build-repo.ps1 Builds a Git repository. Read more…
build-repos.ps1 Builds all Git repositories in a folder. Read more…
check-repo.ps1 Checks a Git repository. Read more…
clean-repo.ps1 Cleans a Git repository from untracked files. Read more…
clean-repos.ps1 Cleans all Git repositories in a folder from untracked files. Read more…
clone-repos.ps1 Clones well-known Git repositories. Read more…
configure-git.ps1 Sets up the Git user configuration. Read more…
fetch-repo.ps1 Fetches updates for a Git repository. Read more…
fetch-repos.ps1 Fetches updates for all Git repositories in a folder. Read more…
list-branches.ps1 Lists all branches in a Git repository. Read more…
list-commits.ps1 Lists all commits in a Git repository. Read more…
list-latest-tag.ps1 Lists the latest tag on the current branch in a Git repository. Read more…
list-latest-tags.ps1 Lists the latests tags in all Git repositories under a directory. Read more…
list-repos.ps1 Lists the Git repositories in a folder. Read more…
list-submodules.ps1 Lists the submodules in a Git repository. Read more…
list-tags.ps1 Lists all tags in a Git repository. Read more…
new-branch.ps1 Creates a new branch in a Git repository. Read more…
new-tag.ps1 Creates a new tag in a Git repository. Read more…
pick-commit.ps1 Cherry-picks a Git commit into multiple branches. Read more…
pull-repo.ps1 Pulls updates for a Git repository. Read more…
pull-repos.ps1 Pulls updates for all Git repositories in a folder. Read more…
remove-tag.ps1 Removes a tag in a Git repository. Read more…
switch-branch.ps1 Switches the branch in a Git repository. Read more…
sync-repo.ps1 Synchronizes a Git repository by push & pull. Read more…

🔎 Scripts for PowerShell

Script Description
daily-tasks.sh Execute PowerShell scripts automatically as daily tasks (Linux only). Read more…
introduce-powershell.ps1 Introduces PowerShell to new users. Read more…
list-aliases.ps1 Lists all PowerShell aliases. Read more…
list-automatic-variables.ps1 Lists the automatic variables of PowerShell. Read more…
list-cheat-sheet.ps1 Lists the PowerShell cheat sheet. Read more…
list-cmdlets.ps1 Lists the PowerShell cmdlets. Read more…
list-console-colors.ps1 Lists all console colors. Read more…
list-modules.ps1 Lists the PowerShell modules. Read more…
list-profiles.ps1 Lists your PowerShell profiles. Read more…
list-scripts.ps1 Lists all PowerShell scripts in this repository. Read more…
new-script.ps1 Creates a new PowerShell script. Read more…
set-profile.ps1 Updates your PowerShell user profile. Read more…

🛒 Various PowerShell Scripts

Script Description Help
add-memo.ps1 Adds the given memo text to $HOME/Memos.csv Help
check-ipv4-address.ps1 Checks the given IPv4 address for validity Help
check-ipv6-address.ps1 Checks the given IPv6 address for validity Help
check-mac-address.ps1 Checks the given MAC address for validity Help
check-subnet-mask.ps1 Checks the given subnet mask for validity Help
check-weather.ps1 Checks the current weather for critical values Help
display-time.ps1 Displays the current time for 10 seconds by default Help
list-anagrams.ps1 Lists all anagrams of the given word Help
list-city-weather.ps1 Lists the current weather of cities worldwide (west to east) Help
list-countries.ps1 Lists details of all countries Help
list-credits.ps1 Shows the credits Help
list-crypto-rates.ps1 Lists the current crypto exchange rates Help
list-environment-variables.ps1 Lists all environment variables Help
list-emojis.ps1 Lists the emojis of Unicode 13.0 Help
list-fritzbox-calls.ps1 Lists the FRITZ!Box calls Help
list-fritzbox-devices.ps1 Lists FRITZ!Box’s known devices Help
list-earthquakes.ps1 Lists earthquakes with magnitude >= 6.0 for the last 30 days Help
list-exchange-rates.ps1 Lists the current exchange rates for the given currency Help
list-memos.ps1 Lists the memos at $HOME/Memos.csv Help
list-mysql-tables.ps1 Lists the MySQL server tables Help
list-news.ps1 Lists the latest news Help
list-os-releases.ps1 Lists operating system releases and download URL Help
list-os-updates.ps1 Lists operating system updates Help
list-passwords.ps1 Prints a list of random passwords Help
list-pins.ps1 Prints a list of random PIN’s Help
list-sql-tables.ps1 Lists the SQL server tables Help
list-tiobe-index.ps1 Lists the TIOBE index of top programming languages Help
list-weather.ps1 Lists the hourly weather Help
locate-city.ps1 Prints the geographic location of the given city Help
locate-ipaddress.ps1 Prints the geographic location of the given IP address Help
locate-zip-code.ps1 Prints the geographic location of the given zip-code Help
moon.ps1 Prints the current moon phase Help
new-qrcode.ps1 Generates a new QR code image file Help
reboot-fritzbox.ps1 Reboots the FRITZ!box device Help
scan-ports.ps1 Scans the network for open/closed ports Help
send-email.ps1 Sends an email message Help
send-tcp.ps1 Sends a TCP message to the given IP address and port Help
send-udp.ps1 Sends a UDP datagram message to the given IP address and port Help
set-timer.ps1 Sets a timer for a countdown Help
simulate-presence.ps1 Simulates the human presence against burglars Help
start-calibre-server.ps1 Starts a local Calibre server Help
start-ipfs-server.ps1 Starts a local IPFS server Help
switch-shelly1.ps1 Switches a Shelly1 device in the local network Help
translate-file.ps1 Translates the given text file into other languages Help
translate-files.ps1 Translates the given text files into any supported language Help
translate-text.ps1 Translates the given text in English into other languages Help
weather.ps1 Prints the current weather forecast Help
weather-report.ps1 Prints the local weather report Help
what-is.ps1 Prints a description of the given abbreviation Help
write-animated.ps1 Writes animated text Help
write-big.ps1 Writes the given text in big letters Help
write-blue.ps1 Writes the given text in a blue foreground color Help
write-braille.ps1 Writes the given text in Braille Help
write-calendar.ps1 Writes the calendar (month of year) Help
write-green.ps1 Writes the given text in a green foreground color Help
write-joke.ps1 Writes a random Juck Norris joke Help
write-lowercase.ps1 Writes the given text in lowercase letters Help
write-marquee.ps1 Writes the given text as marquee Help
write-morse-code.ps1 Writes the given text in Morse code Help
write-motd.ps1 Writes the message of the day (MOTD) Help
write-quote.ps1 Writes a random quote Help
write-red.ps1 Writes the given text in a red foreground color Help
write-rot13.ps1 Encodes or decodes the given text with ROT13 Help
write-typewriter.ps1 Writes the given text with the typewriter effect Help
write-uppercase.ps1 Writes the given text in uppercase letters Help
write-vertical.ps1 Writes the given text in vertical direction Help

Feedback

Send your email feedback to: markus [at] fleschutz [dot] de

License & Copyright

This open source project is licensed under the CC0 license. All trademarks are the property of their respective owners.

Содержание

Системный администратор

Управление дисками и файлами

Получение текущего расположения (Get-Location)

Чтобы определить путь к текущему каталогу, введите команду Get-Location.

PS> Get-Location
Path
----
C:Documents and SettingsPowerUser

Примечание

Командлет Get-Location аналогичен команде pwd в оболочке BASH. Командлет Set-Location аналогичен команде cd в Cmd.exe.

Настройка текущего расположения (Set-Location)

Команда Get-Location используется с командой Set-Location. Команда Set-Location позволяет вам указать расположение текущего каталога.

Set-Location -Path C:Windows

Обратите внимание, что после ввода команды вы не получите прямого отклика о действии команды. Большинство команд Windows PowerShell, выполняющих действия, практически не создают выходных данных, так как выходные данные не всегда полезны. Чтобы проверить успешность внесения изменения в каталог при вводе команды Set-Location, укажите параметр -PassThru при вводе команды Set-Location.

PS> Set-Location -Path C:Windows -PassThru

Path
----
C:WINDOWS

Параметр -PassThru можно использовать с некоторыми командами Set в Windows PowerShell для возврата сведений о результате, когда отсутствуют выходные данные по умолчанию.

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

Например, если вы находитесь в папке C:Windows, точка ( . ) представляет C:Windows, а две точки ( .. ) представляют C: . Текущее расположение можно изменить на корень диска C: путем ввода следующей команды:

PS> Set-Location -Path .. -PassThru

Path
----
C:

Тот же метод работает для дисков Windows PowerShell, которые не являются дисками файловой системы, например HKLM: . В реестре в качестве расположения можно задать раздел HKLMSoftware путем ввода следующего кода:

PS> Set-Location -Path HKLM:SOFTWARE -PassThru

Path
----
HKLM:SOFTWARE

После этого можно изменить расположение каталога на родительский каталог, который является корнем диска Windows PowerShell HKLM: с помощью относительного пути:

PS> Set-Location -Path .. -PassThru

Path
----
HKLM:

Вы можете ввести Set-Location или использовать любой из встроенных псевдонимов Windows PowerShell для Set-Location (cd, chdir, sl). Пример:

cd -Path C:Windows
chdir -Path .. -PassThru
sl -Path HKLM:SOFTWARE -PassThru

Сохранение и отзыв последних расположений (Push-Location и Pop-Location)

При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. Командлет Push-Location в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться по нему на шаг назад, используя дополнительный командлет Pop-Location.

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

PS> Get-Location

Path
----
C:Documents and SettingsPowerUser

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

Push-Location -Path "Local Settings"

После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:

Push-Location -Path Temp

Чтобы убедиться, что каталоги изменены, введите команду Get-Location.

PS> Get-Location

Path
----
C:Documents and SettingsPowerUserLocal SettingsTemp

После этого можно перейти в последний открытый каталог, введя команду Pop-Location, и проверить изменение, введя команду Get-Location.

PS> Pop-Location
PS> Get-Location

Path
----
C:Documents and SettingsmeLocal Settings

Как и в случае с командлетом Set-Location, можно включить параметр -PassThru при вводе командлета Pop-Location, чтобы открыть указанный каталог.

PS> Pop-Location -PassThru

Path
----
C:Documents and SettingsPowerUser

Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя

Set-Location \FS01Public

или диспетчер конфигурации служб

Push-Location \FS01Public

Чтобы изменить расположение на любой доступный диск, можно использовать команды Push-Location и Set-Location. Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на него, введя команду Set-Location D: .

Если дисковод пуст, вы получите следующее сообщение об ошибке:

PS> Set-Location D:
Set-Location : Cannot find path 'D:' because it does not exist.

Работа с файлами и папками. Получение списка файлов и папок, содержащихся в папке.

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Get-ChildItem -Path C: -Force

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Get-ChildItem -Path C: -Force -Recurse

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров PathFilterInclude и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object.

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)}

Копирование файлов и папок

Копирование выполняется с помощью командлета Copy-Item. Следующая команда создает резервную копию C:boot.ini в C:boot.bak:

Copy-Item -Path C:boot.ini -Destination C:boot.bak

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

Copy-Item -Path C:boot.ini -Destination C:boot.bak -Force

Эта команда работает, даже если целевой объект доступен только для чтения.

Так же выполняется и копирование папок. Эта команда копирует папку C:temptest1 в новую папку C:tempDeleteMe рекурсивно.

Copy-Item C:temptest1 -Recurse C:tempDeleteMe

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке C:data, в папку C:temptext:

Copy-Item -Filter *.txt -Path c:data -Recurse -Destination C:temptext

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:boot.ini в файле C:boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:boot.ini', 'C:boot.bak')

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку C:tempNew Folder:

New-Item -Path 'C:tempNew Folder' -ItemType Directory

Эта команда создает пустой файл C:tempNew Folderfile.txt.

New-Item -Path 'C:tempNew Folderfile.txt' -ItemType File

Важно!

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки C:tempDeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

Remove-Item -Path C:tempDeleteMe

Confirm
The item at C:tempDeleteMe has children and the Recurse parameter was not
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse:

Remove-Item -Path C:tempDeleteMe -Recurse

Подключение локальной папки как диска

Отобразить локальную папку можно с помощью команды New-PSDrive. Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist. Но с этим параметром можно использовать только удаленные пути.

Чтение текстового файла в массив

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

PS> Get-Content -Path C:boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional"
 /noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)WINDOWS=" Microsoft Windows XP Professional
with Data Execution Prevention" /noexecute=optin /fastdetect

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

PS> (Get-Content -Path C:boot.ini).Length
6

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле C:tempdomainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Вы можете использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers:

$Computers = Get-Content -Path C:tempDomainMembers.txt

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.

Работа с файлами, папками и разделами реестра

Перечисление файлов, папок и разделов реестра (Get-ChildItem)

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

Если необходимо вернуть все файлы и папки, которые находятся непосредственно в папке C:Windows, введите:

PS> Get-ChildItem -Path C:Windows
    Directory: Microsoft.Windows PowerShell.CoreFileSystem::C:Windows

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-16   8:10 AM          0 0.log
-a---        2005-11-29   3:16 PM         97 acc1.txt
-a---        2005-10-23  11:21 PM       3848 actsetup.log
...

Списки выглядят аналогично тем спискам, которые появляются при вводе команды dir в Cmd.exe или команды ls в командной оболочке UNIX.

С помощью параметров командлета Get-ChildItem можно создавать очень сложные списки. Далее рассмотрим несколько сценариев. Синтаксис командлета Get-ChildItem можно увидеть, введя:

Get-Command -Name Get-ChildItem -Syntax

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

Перечисление всех элементов в контейнере (-Recurse)

Чтобы увидеть оба элемента в папке Windows и все элементы во вложенных папках, используйте параметр Recurse для Get-ChildItem. В списке отображается все, что находится в папке Windows, а также элементы в ее вложенных папках. Пример:

PS> Get-ChildItem -Path C:WINDOWS -Name
addins
AppPatch
assembly
...

Принудительное перечисление скрытых элементов (-Force)

В выходных данных команды Get-ChildItem не отображаются элементы, которые обычно невидимы в проводнике или Cmd.exe. Чтобы показать скрытые элементы, используйте параметр Force для Get-ChildItem. Пример:

Get-ChildItem -Path C:Windows -Force

Этот параметр называется Force, так как позволяет принудительно переопределить обычное поведение команды Get-ChildItem. Параметр Force широко используется для принудительного выполнения действия командлетом. Тем не менее, он не будет выполнять действия, компрометирующие систему безопасности.

Сопоставление имен элементов с подстановочными знаками

Команда Get-ChildItem допускает подстановочные знаки в пути к перечисляемым элементам.

Так как сопоставление с подстановочными знаками обрабатывается подсистемой Windows PowerShell, все командлеты, которые принимают подстановочные знаки, используют одну нотацию и имеют одно поведение сопоставления. В нотацию подстановочных знаков Windows PowerShell входит:

  • Звездочка (*) — соответствует нулю или большему количеству вхождений любого символа.
  • знак вопроса (?) — соответствует ровно одному символу;
  • Открывающая квадратная скобка ([) и закрывающая квадратная скобка (]) — заключают в себя набор символов для сопоставления.

Далее приводится несколько примеров работы спецификации из подстановочных знаков.

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

PS> Get-ChildItem -Path C:Windows?????.log

    Directory: Microsoft.Windows PowerShell.CoreFileSystem::C:Windows
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
...
-a---        2006-05-11   6:31 PM     204276 ocgen.log
-a---        2006-05-11   6:31 PM      22365 ocmsn.log
...
-a---        2005-11-11   4:55 AM         64 setup.log
-a---        2005-12-15   2:24 PM      17719 VxSDM.log
...

Чтобы найти в каталоге Windows все файлы с именами, начинающимися на букву x, введите:

Get-ChildItem -Path C:Windowsx*

Чтобы найти все файлы с именами, начинающимися на x или z, введите:

Get-ChildItem -Path C:Windows[xz]*

Исключение элементов (-Exclude)

Вы можете исключить определенные элементы с помощью параметра Exclude для Get-ChildItem. Это позволит вам выполнить сложную фильтрацию в одном операторе.

Например, предположим, что вы пытаетесь найти библиотеку службы времени Windows в папке System32 и все, что вам известно об имени библиотеки, — то, что оно начинается на W и содержит «32».

Выражение w*32*.dll найдет все библиотеки DLL, удовлетворяющие условию, но может также вернуть библиотеки Windows 95 и библиотеки, совместимые с 16-разрядной версией Windows, в именах которых содержится «95» или «16». Файлы с такими числами в именах можно пропустить, используя параметр Exclude с шаблоном *[9516]* :

PS> Get-ChildItem -Path C:WINDOWSSystem32w*32*.dll -Exclude *[9516]*

Directory: Microsoft.PowerShell.CoreFileSystem::C:WINDOWSSystem32
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM     174592 w32time.dll
-a---        2004-08-04   8:00 AM      22016 w32topl.dll
-a---        2004-08-04   8:00 AM     101888 win32spl.dll
-a---        2004-08-04   8:00 AM     172032 wldap32.dll
-a---        2004-08-04   8:00 AM     264192 wow32.dll
-a---        2004-08-04   8:00 AM      82944 ws2_32.dll
-a---        2004-08-04   8:00 AM      42496 wsnmp32.dll
-a---        2004-08-04   8:00 AM      22528 wsock32.dll
-a---        2004-08-04   8:00 AM      18432 wtsapi32.dll

Смешение параметров Get-ChildItem

В одной команде можно использовать несколько параметров Get-ChildItem. Перед тем как комбинировать параметры, убедитесь, что понимаете принципы сопоставления подстановочных знаков. Например, следующая команда не возвращает результатов:

Get-ChildItem -Path C:Windows*.dll -Recurse -Exclude [a-y]*.dll

Результаты отсутствуют, даже если существуют две библиотеки, которые начинаются на букву z в папке Windows.

Результаты не возвращены, так как подстановочный знак указан как часть пути. Хотя команда и была рекурсивной, командлет Get-ChildItem ограничил элементы до тех, которые находятся в папке Windows с именами, заканчивающимися на .dll.

Чтобы указать рекурсивный поиск для файлов, имена которых соответствуют специальному шаблону, используйте параметр -Include.

PS> Get-ChildItem -Path C:Windows -Include *.dll -Recurse -Exclude [a-y]*.dll

    Directory: Microsoft.Windows PowerShell.CoreFileSystem::C:WindowsSystem32Setup

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM       8261 zoneoc.dll

    Directory: Microsoft.Windows PowerShell.CoreFileSystem::C:WindowsSystem32

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM     337920 zipfldr.dll

Работа с записями реестра. Создание списков записей реестра.

Существует несколько способов просмотра реестра. Самый простой — получить имена свойств, связанные с разделом. Например, чтобы просмотреть имена записей в разделе реестра HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion, используйте Get-Item. Разделы реестра содержат свойство с универсальным именем Property, которое является списком записей реестра в разделе. Следующая команда выбирает свойство Property и расширяет элементы так, чтобы они отображались в списке:

Get-Item -Path Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion |
  Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId

Чтобы просмотреть записи реестра в более удобочитаемой форме, используйте Get-ItemProperty.

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion
PSPath              : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESO
                      FTWAREMicrosoftWindowsCurrentVersion
PSParentPath        : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESO
                      FTWAREMicrosoftWindows
PSChildName         : CurrentVersion
PSDrive             : HKLM
PSProvider          : Microsoft.PowerShell.CoreRegistry
DevicePath          : C:WINDOWSinf
MediaPathUnexpanded : C:WINDOWSMedia
ProgramFilesDir     : C:Program Files
CommonFilesDir      : C:Program FilesCommon Files
ProductId           : 76487-338-1167776-22465
WallPaperDir        : C:WINDOWSWebWallpaper
MediaPath           : C:WINDOWSMedia
ProgramFilesPath    : C:Program Files
PF_AccessoriesName  : Accessories
(default)           :

Все свойства Windows PowerShell раздела имеют префиксы PS, например PSPathPSParentPathPSChildName и PSProvider.

Для создания ссылки на текущее расположение можно использовать нотацию *.*. Set-Location можно использовать для изменения значения на контейнер реестра CurrentVersion.

Set-Location -Path Registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion

Кроме того, можно использовать встроенный диск HKLM PSDrive с Set-Location.

Set-Location -Path hklm:SOFTWAREMicrosoftWindowsCurrentVersion

Затем можно использовать нотацию *.* для текущего расположения, чтобы перечислить свойства без указания полного пути.

Get-ItemProperty -Path .
...
DevicePath          : C:WINDOWSinf
MediaPathUnexpanded : C:WINDOWSMedia
ProgramFilesDir     : C:Program Files
...

Расширение пути работает так же, как и в файловой системе, поэтому в этом расположении можно получить перечисление ItemProperty для HKLM:SOFTWAREMicrosoftWindowsHelp с помощью Get-ItemProperty -Path ..Help.

Получение одной записи реестра

Если необходимо получить конкретную запись в разделе реестра, можно использовать один из нескольких возможных подходов. Этот пример получает значение DevicePath в HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion.

Вместе с Get-ItemProperty используйте параметр Path, чтобы указать имя раздела и параметр Name, а также имя записи DevicePath.

Get-ItemProperty -Path HKLM:SoftwareMicrosoftWindowsCurrentVersion -Name DevicePath
PSPath       : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESoftware
               MicrosoftWindowsCurrentVersion
PSParentPath : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESoftware
               MicrosoftWindows
PSChildName  : CurrentVersion
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.CoreRegistry
DevicePath   : C:WINDOWSinf

Эта команда возвращает стандартные свойства Windows PowerShell, а также свойство DevicePath.

 Примечание

Хотя Get-ItemProperty содержит параметры FilterInclude и Exclude, их нельзя использовать для фильтрации по имени свойства. Эти параметры относятся к разделам реестра (путям элементов), а не записям реестра. Записи реестра — это свойства элементов.

Другой вариант — использовать средство командной строки Reg.exe. Для получения справки по reg.exe введите reg.exe /? в командной строке. Чтобы найти запись DevicePath, используйте reg.exe, как показано в следующей команде:

reg query HKLMSOFTWAREMicrosoftWindowsCurrentVersion /v DevicePath
! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion
    DevicePath  REG_EXPAND_SZ   %SystemRoot%inf

Также можно использовать объект WshShell COM, чтобы найти некоторые записи реестра, хотя этот метод не работает с большими двоичными данными или именами записей реестра, содержащими такие символы, как . Добавьте имя свойства с разделителем «» в путь элемента:

(New-Object -ComObject WScript.Shell).RegRead("HKLMSOFTWAREMicrosoftWindowsCurrentVersionDevicePath")
%SystemRoot%inf

Настройка одной записи реестра

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

  1. Получите текущее значение записи Path с помощью Get-ItemProperty.
  2. Добавьте новое значение, отделив его с помощью ;.
  3. Используйте Set-ItemProperty с указанным разделом, именем записи и значением, чтобы изменить запись реестра.
$value = Get-ItemProperty -Path HKCU:Environment -Name Path
$newpath = $value.Path += ";C:srcbin"
Set-ItemProperty -Path HKCU:Environment -Name Path -Value $newpath

Примечание

Хотя Set-ItemProperty содержит параметры FilterInclude и Exclude, их нельзя использовать для фильтрации по имени свойства. Эти параметры относятся в разделам реестра (путям элементов), а не к записям реестра (свойствам элементов).

Другой вариант — использовать средство командной строки Reg.exe. Для получения справки по reg.exe введите reg.exe /? . в командной строке.

В следующем примере запись Path изменяется за счет удаления пути, добавленного в предыдущем примере. Get-ItemProperty по-прежнему используется для получения текущего значения, исключая анализ строки, возвращаемой reg query. Методы SubString и LastIndexOf используются для получения последнего добавленного пути в запись Path.

$value = Get-ItemProperty -Path HKCU:Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCUEnvironment /v Path /d $newpath /f
The operation completed successfully.

Создание новых записей реестра

Чтобы добавить новую запись реестра с именем PowerShellPath в раздел CurrentVersion, используйтеNew-ItemProperty с путем к разделу, именем записи и значением записи. В этом примере используется значение переменной Windows PowerShell $PSHome, в которой хранится путь к каталогу установки Windows PowerShell.

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

New-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersion -Name PowerShellPath -PropertyType String -Value $PSHome
PSPath         : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion
PSParentPath   : Microsoft.PowerShell.CoreRegistry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
PSChildName    : CurrentVersion
PSDrive        : HKLM
PSProvider     : Microsoft.PowerShell.CoreRegistry
PowerShellPath : C:Program FilesWindows PowerShellv1.0

Значение PropertyType должно быть именем элемента перечисления Microsoft.Win32.RegistryValueKind из следующей таблицы:

Примечание

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

New-ItemProperty -Name PowerShellPath -PropertyType String -Value $PSHome `
  -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersion, HKCU:SOFTWAREMicrosoftWindowsCurrentVersion

Кроме того, можно перезаписать существующее значение записи реестра, добавив параметр Force в любую команду New-ItemProperty.

Переименование записей реестра

Чтобы переименовать запись PowerShellPath в PSHome, используйте Rename-ItemProperty.

Rename-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersion -Name PowerShellPath -NewName PSHome

Чтобы отобразить переименованное значение, добавьте параметр PassThru в команду.

Rename-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersion -Name PowerShellPath -NewName PSHome -passthru

Удаление записей реестра

Чтобы удалить записи реестра PSHome и PowerShellPath, используйте Remove-ItemProperty.

Remove-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:SOFTWAREMicrosoftWindowsCurrentVersion -Name PowerShellPath

powershell скрипты

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

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

Windows Powershell — оснастка командной строки и скриптовый язык для различной автоматизации задач и администрирования в windows. Официальный сайт — microsoft.com/powershell

Содержание

  • 1 Удаление всех бекапов кроме трех последних
  • 2 Удаляем файлы старше трех месяцев
  • 3 Разрешение скачанного изображения
  • 4 Среднее арифметическое трех последних чисел
  • 5 Количество файлов в папках и размер папок
  • 6 Случайный афоризм из файла
  • 7 Отображение mp3-файлов с низким битрейтом
  • 8 Удаление изображений с плохим качеством
  • 9 Копирование бекапов на резервную площадку
  • 10 Информация об обновлениях WSUS
  • 11 Лочим экран и произносим текст
  • 12 Вывод размера какой-либо веб страницы
  • 13 Остальные Powershell-скрипты:

Удаление всех бекапов кроме трех последних

На сервере локально сохраняются бекапы, где папки именуются таким образом: «klbackup2014-01-22#23-00-00». PowerShell скрипт переносит эти папки на сетевой диск и хранить не более 3-х последних бекапов.

Copy-Item "C:backupsklbackup*" "\ServerBackupsklBackup" -force -recurse -ErrorAction stop
Remove-Item "C:backupsklbackup*" -force -recurse
$folders = Get-ChildItem "\ServerBackupsklBackupklbackup*"
$i = 0
While ($i -lt $folders.count-3) {
   Remove-Item $folders[$i] -force -recurse
   $i++
}

Удаляем файлы старше трех месяцев

$date = (Get-Date).AddMonths(-3)
Get-ChildItem -Path D:FilesCommon | where {!$_.PSIsContainer} |
foreach {
   if ($_.LastWriteTime -lt $date) {
      # в тестовых целях указываем -whatif
      # когда убедимся что все корректно работает то убираем его
      Remove-Item $_ -whatif
   }
}

Разрешение скачанного изображения

PowerShell скрипт скачивает изображение из Интернета и отображает ее разрешение

Function Get-Image{
   begin{[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") |Out-Null}
   process{
      $fi=[System.IO.FileInfo]$_
      if( $fi.Exists){
         $img = [System.Drawing.Image]::FromFile($_)
         $img.Clone()
         $img.Dispose()
      }else{Write-Host "File not found: $_" -fore yellow }
   }
   end{}
}

#Скачиваем файл
$webclient = New-Object System.Net.WebClient
$url = "http://cs418720.userapi.com/v418720852/20d0/DiSlb-_mVBg.jpg"
$file = "D:ImageSize.jpg"
$webclient.DownloadFile($url,$file)

#Получаем ширину и высоту изображения
$image = $file | Get-Image
$Width = $image.Width
$Height = $image.Height
#Вывод на экран
write-output “Width:$Width, Height:$Height"

Среднее арифметическое трех последних чисел

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

$date = Get-Date -format yyyy-MM-dd
$filename = "C:Program FilesZabbixCheckHost_INET-" + $date + ".res"
$file = Get-Content $filename #считываем файл в переменную. В файле каждая строка содержит по числу.
$lenght = $file.count #получаем количество строк файла
$avg=([int]$file[$lenght-1]+[int]$file[$lenght-2]+[int]$file[$lenght-3])/3 #вычисляем арифметическое среднее трех последних чисел
Write-Host([int]$avg) #выводим среднее арифметическое с откидыванием дроби

Количество файлов в папках и размер папок

PowerShell скрипт выводит на экран и в файл D:CountFiles.csv информацию о том, сколько содержит файлов каждая папка и подпапки в директории D:Photos, а также размер этих папок и подпапок. csv файл можно импортировать в exel или гугл-таблицы и отсортировать столбцы по возрастанию или спаданию. Скрипт может пригодиться при оптимизации файлового хранилища.

$source="D:Photos"
Get-ChildItem $source -recurse -force | where {$_.psIscontainer} | foreach {
   $count = Get-ChildItem $_.fullname -recurse | where {$_.length} | Measure-Object -property length -Sum
   Write-Host($_.FullName)
   $FilesSize = '{0:F}' -f ((($count.Sum)/1024)/1024)
   Write-Host("Files: " + $count.count )
   Write-Host("Size: " + $FilesSize + " MB")
   '"' + $_.FullName + '","' + $count.count + '","' + $FilesSize + '"' | Out-File D:CountFiles.csv -Append
}

Случайный афоризм из файла

#Автор скрипта: https://elims.org.ua
#читаем содержимое файла в масив построчно и берем случайную строку
$file = Get-Content "C:aphorism.txt"
$aphorism = Get-Random -input $file #берем случайный афоризм из массива афоризмов
$tag = Get-Random -input " #афоризмы"," #цитаты", " #цитаты" #берем случайный тег
$aphorism = $aphorism + $tag
Write-Host($aphorism)

Отображение mp3-файлов с низким битрейтом

PowerShell скрипт выводит список mp3-файлов, которые находятся в папке D:vk-music и имеют битрейт мене 320

#скрипт выводит список mp3-файлов, которые находятся в папке D:vk-music и имеют битрейт мене 320 
$objShell = New-Object -ComObject Shell.Application
$mp3files = Get-ChildItem "D:vk-music" -include "*.mp3" -recurse #получили список mp3-файлов
foreach($mp3Item in $mp3files){ #для каждого файла из списка
 $file = split-path $mp3Item -leaf #из полного имени вырезали имя файла
 $path = split-path $mp3Item #из полного имени вырезали адрес папки
 $objFolder = $objShell.namespace($path)
 $objFile = $objFolder.parsename($file)
 if ($objFolder.getDetailsOf($objFile, 28)) { # 28 - номер свойства файла, в котором хранится информация о битрейте
  $bitrate = [int]$objFolder.getDetailsOf($objFile, 28).Substring(1,3) #из строки, где хранится битрейт, вырезаем числовое значение битрейта
  if ($bitrate -lt 320) { #если битрейт меньше 320
   "№" + ++$i + ' bitrate: ' + $bitrate + " file: " + [string]$mp3Item #выводим битрейт и полное имя файла
  }
 }
}

Удаление изображений с плохим качеством

Удаляем в указанных папках (рекурсивно) изображения jpg с худшим качеством чем HD Ready

Function Get-Image{
 begin{[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") |Out-Null}
 process{
 $fi=[System.IO.FileInfo]$_
 if( $fi.Exists){
 $img = [System.Drawing.Image]::FromFile($_)
 $img.Clone()
 $img.Dispose()
 }else{Write-Host "File not found: $_" -fore yellow }
 }
 end{}
}

$paths = @()
$paths = $paths + "D:Folder1"
$paths = $paths + "E:Folder2"
$paths = $paths + "X:Folder3"

Foreach ($path in $paths) { 
 Get-ChildItem -Path $path -recurse -filter *.jpg | where {!$_.PSIsContainer} | foreach {
 #Получаем ширину и высоту изображения
 $image = $_.FullName | Get-Image
 $Width = $image.Width
 $Height = $image.Height
 #Вывод на экран 
 $pixels = $Width*$Height
 $hd_ready = 1280*720
 $string = $_.FullName+' Width:'+$Width+' Height:'+$Height + " Pixels:"+$pixels 
 $image.dispose()
 if ($pixels -le $hd_ready) {
 Remove-Item $_.FullName 
 write-host $string
 } 
 }
}

Копирование бекапов на резервную площадку

Если PowerShell скрипт запущен в определенное время и определенный день, то он начинает копировать файлы из указанных папок. Ход процесса записывается в лог файл.

После окончания работы:

  • присылается письмо в котором указано:
    • свободное место на локальных дисках (до старта и после окончания), объем бекапа
    • время старта и окончания, длительность бекапа
    • средняя скорость копирования
  • компьютер выключается

Компьютер выключается потому, что он в основном выключен. Для резервного копирования он автоматически включается (настройка в биосе).

$StartTimeHour = (Get-Date).Hour #Запоминаем когда запустилась задача
$Day_of_week = [int]((Get-Date).DayofWeek) #текущий день недели
if ((($Day_of_week -eq 2)-or($Day_of_week -eq 4)-or($Day_of_week -eq 6))-and($StartTimeHour -eq 11)) {
#старт копирования если сейчас вторник, среда, суббота и при этом 11 часов
 $StartTime = Get-Date -Format "yyyy.MM.dd HH:mm:ss" #время старта копирования 
 $Free_Space_Start = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {[math]::truncate($_.freespace / 1GB)} #свободное место до бекапа
 $Free_Space_Start_Bytes = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {$_.freespace} #свободное место до бекапа
 $log_file = "D:Backupslog.txt" #лог файл скрипта, можно понять на каком этапе работа скрипта
 $date = "{0:yyyy-MM-dd}" -f (get-date) #текущая дата для имени папки
 $path = "D:Backups" + $date + "" #имя папки
 if (-not(Test-Path $path)) { #если папка не существует
 write-host "создаем папку: " + $path 
 $result = New-Item -ItemType directory -Path $path #создаем папку
 }
 #копируем резервные копии медка
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \172.16.13.1BackupsMedoc"
 "##################################################" | Out-File -Append $log_file -Encoding UTF8
 $string | Out-File -Append $log_file -Encoding UTF8 
 & robocopy \172.16.13.1BackupsMedoc D:BackupsMedoc /e /log:"D:Backupsrobocopy_log.txt"
 #копируем резервные копии разных устройств и ПО
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \172.16.13.1BackupsOther"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \172.16.13.1BackupsOther D:BackupsOther /e /log:"D:Backupsrobocopy_log.txt"
 #копируем резервные копии Windows с 1-го сервера
 $path = $path + "WindowsImageBackup"
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \172.16.13.1BackupsWindowsImageBackup"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \172.16.13.1BackupsWindowsImageBackup $path /e /log:"D:Backupsrobocopy_log.txt"
 #копируем резервные копии Windows с 2-го сервера
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Start Copy \172.16.13.2BackupsWindowsImageBackup"
 $string | Out-File -Append $log_file -Encoding UTF8
 & robocopy \172.16.13.2BackupsWindowsImageBackup $path /e /log:"D:Backupsrobocopy_log.txt"
 #запись в лог-файл окончания работы
 $time = "{0:yyyy-MM-dd HH:mm:ss}" -f (get-date)
 $string = $time + " Finish Backup"
 $string | Out-File -Append $log_file -Encoding UTF8
 "##################################################" | Out-File -Append $log_file -Encoding UTF8
 #Формируем данные для письма
 $EndTime = Get-Date -Format "yyyy.MM.dd HH:mm:ss"
 $Free_Space_End = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {[math]::truncate($_.freespace / 1GB)} #свободное место после бекапа
 $Free_Space_End_Bytes = Get-WMIObject Win32_LogicalDisk -Filter "DeviceID='D:'" | ForEach-Object {$_.freespace} #свободное место до бекапа 
 $backup_Size = $Free_Space_Start-$Free_Space_End
 $backup_Size_Bytes = $Free_Space_Start_Bytes-$Free_Space_End_Bytes
 $Work_time = $(NEW-TIMESPAN –Start $StartTime –End $EndTime)
 $Work_time_seconds = $Work_time.TotalSeconds
 $NetworkSpeed = '{0:N1}' -f ((($backup_Size_Bytes / $Work_time_seconds) / (1024*1024)) * 8)
 $Mail_String = "Свободное место до бекапа: " + $Free_Space_Start + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Свободное место после бекапа:" + $Free_Space_End + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Размер бекапа: " + $backup_Size + " ГБ | `r`n"
 $Mail_String = $Mail_String + "Старт бекапа: " + $StartTime + " | `r`n"
 $Mail_String = $Mail_String + "Конец бекапа: " + $EndTime + " | `r`n"
 $Mail_String = $Mail_String + "Время выполнения: " + $Work_time + " | `r`n"
 $Mail_String = $Mail_String + "Средняя скорость копирования: " + $NetworkSpeed + " Мбит в секунду `r`n" 
 Write-host $Mail_String 
 #Заголовки письма и данные почтового ящика
 $From = "admin-notify@домен.com.ua"
 $To = "admin@домен.ком.ua"
 $SMTPServer = "адрес.сервера.com.ua"
 $SMTPPort = "25"
 $Username = "admin-notify@домен.ком.ua"
 $Password = "тут_пароль"
 $subject = "Copy Backups to ReserveServer" 
 $body = $Mail_String 
 #формируем сообщение в формате html:
 $message = New-Object System.Net.Mail.MailMessage $From, $To
 $message.Subject = $subject
 $message.IsBodyHTML = $true
 $message.Body = $body
 #Отправляем:
 Write-host "Отправляем письмо"
 $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort)
 $smtp.EnableSSL = $true
 $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
 $smtp.Send($message)
 Write-host "Письмо отправленно"
 & shutdown -s -t 300 #выключаем компьютер через 5 минут
}

Информация об обновлениях WSUS

Этот Powershell скрипт получает информацию со WSUS и показывает:

  • количество обновлений по заданных критериям
  • краткую сводную информацию об обновлениях
  • имена обновлений
  • отображает список обновлений по заданным критериям для каждого компьютера по отдельности
$WSUSServer = 'SERVER_NAME' #WSUS-сервер
$PortNumber = 8530 #http порт wsus
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($WSUSServer,$False,$PortNumber)
$UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
#$UpdateScope.ApprovedStates = 'NotApproved' #указываем критерии апдейтов: не одобренные
#$UpdateScope.IncludedInstallationStates = 'NotInstalled' #указываем критерии апдейтов: не проинсталированные
$UpdateScope.IncludedInstallationStates = 'Installed' #указываем критерии апдейтов: проинсталированные
$UpdateScope #просматриваем сформированные критерии апдейтов
$wsus.GetUpdateCount($updatescope) #получаем и выводим количество апдейтов
$wsus.GetUpdateStatus($updatescope,$False) #получаем и выводим краткую информацию об обновлениях
$wsus.GetUpdates($updatescope).Title #выводим имена апдейтов

$computers = $wsus.GetComputerTargets() #все компьютеры со wsus
ForEach ($computer in $computers){ #для каждого компьютера
 $Computername = $computer.fulldomainname #получаем его имя 
 $updates = $computer.GetUpdateInstallationInfoPerUpdate($updateScope) #получаем апдейты по указаным критериям
 $UpdateCount = $updates.Count #количество апдейтов для текущего компьютера
 write-host $Computername $UpdateCount #выводим имя компьютера и количество апдейтов
 $i = 0
 ForEach ($update in $updates) { #для каждого апдейта выводим подробную информацию 
 $i++
 $update_info = $update.GetUpdate() #запрашиваем инфо об апдейте
 $UpdateTitle = $update_info.Title #имя апдейта
 $IsApproved = $update_info.IsApproved #является ли он одобренным 
 write-host $Computername $i "of" $UpdateCount $IsApproved $UpdateTitle 
 }
}

Лочим экран и произносим текст

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

Тригеры из заббикса запрашиваются утилитой zabbixctl и выводяться в текстовый файл, который опубликован по веб-адресу.

Сам powershell скрипт:

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$request = (New-Object System.Net.WebClient).DownloadString("http://server/status.txt") #получаем тригеры
$speak.Rate = -2 #Замедляем скорость произношения
$zabbix_message = ($request -split 'n')[0] #первая строка - первый тригер
if ($zabbix_message.length -ge 1) { #если строка не пустая
 cmd /c rundll32.exe user32.dll,LockWorkStation #лочим экран
 $speak.Speak("zabbix. " + $zabbix_message) #произносим текст
 $Time = Get-Date -Format "yyyy.MM.dd HH:mm:ss" 
 $log_message = $Time + " " + $zabbix_message
 $log_message | Out-File -Append "c:WINDOWSscriptslog.txt" -Encoding UTF8 #записываем в лог-файл
}

Вывод размера какой-либо веб страницы

$web = New-Object System.Net.WebClient
"{0} bytes" -f ($web.DownloadString("https://elims.org.ua/")).length.toString("###,###,##0")

Остальные Powershell-скрипты:

  • Powershell скрипты для Вконтакте
  • Powershell скрипт: Автоответчик болтун для Вконтакте
  • Powershell скрипт: Антиспам в коментариях стены и фотоальбомах сообщества во Вконтакте
  • Powershell скрипт: Чтение Вконтакте через RSS
  • Powershell скрипт: скачиваем фотографии из Вконтакте
  • Powershell скрипт для скачивания музыки из Вконтакте
  • Powershell скрипт: Отправка писем через gmail
  • Powershell скрипт: охрана с помощью вебкамеры
  • PowerShell скрипт автопубликации изображений на блог

Понравилось? =) Поделись с друзьями:

Windows PowerShell: Курс выживания при создании сценариев

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

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

Вы также должны знать, как выполнять сценарии в оболочке, а также помнить, что при выполнении сценария всегда нужно указывать путь и имя файла. Наконец, вы должны понимать, в чем разница при выполнении в среде ISE (Integrated Scripting Environment) и в консоли. В ISE сценарии выполняются в глобальном контексте. В обычной оболочке консоли у сценариев обычно собственный контекст. Я расскажу о контексте, но вы уже должны хотя бы примерно понимать, что он означает и что делает.

Если вам кажется, что вы недостаточно подготовлены, могу посоветовать почитать мою книгу «Learn Windows PowerShell in a Month of Lunches» (Manning Publications, 2011) и веб-сайт по теме, — возможно эти ресурсы помогут вам усвоить больше базовой информации.

Можете пользоваться этими ресурсами в процессе чтения статьи. Попытайтесь выполнить примеры. Если ввести (или скопировать) примеры сценариев в среду Windows PowerShell ISE, начиная со строки, тогда номера строк будут совпадать с номерами строк в описаниях.

Файлы сценариев Windows PowerShell

Файл сценария Windows PowerShell представляет собой простой текстовый файл с расширением .PS1. Единица указывает на версию не Windows PowerShell, а скорее версию обработчика языка. В Windows PowerShell версий 1 и 2 используется обработчик языка версии 1. Поэтому обе версии оболочки устанавливаются в подпапку v1.0 папки WindowsSystem32WindowsPowerShell.

Сценарий Windows PowerShell не совсем похож на командный файл для командной строки, кроме того выполнение сценария не совсем то же самое, что вводить вручную те же команды в той же последовательности. Например, откройте окно консоли и выполните следующее, нажимая Enter после каждой строки:

  1. Get-Service
  2. Get-Process

А теперь введите точно такие же команды в файл сценария или в панель редактирования сценариев в ISE и выполните сценарий. Результаты будут отличаться. При каждом нажатии Enter в Windows PowerShell вы запускаете новый конвейер. Все вводимые вами команды выполняются в одном конвейере. В конце существования конвейера Windows PowerShell преобразует его содержимое в текст на экране. При выполнении этих двух команд в обычной консоли это происходит в двух разных конвейерах.

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

  1. Get-Service;Get-Process

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

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

Надо помнить об этом правиле на протяжении всего времени чтения этой статьи. Сценарий должен создавать один и только один тип выходных данных. Единственное исключение — когда сценарий используется как репозиторий нескольких функций. В этом случае каждая функция должна генерировать один и только один тип выходных данных.

Переменные

Переменные следует считать чем-то вроде ящика, в который можно положить одну или несколько вещей, даже разнородных. У ящика есть имя, и в Windows PowerShell это имя может содержать практически любые символы. Именем переменной может быть как «Var», так и «{my variable}». Во втором примере имя переменной заключено в фигурные скобки, потому что оно содержит пробелы; выглядит это не очень красиво. Рекомендую все-таки использовать в именах переменных только буквы, цифры и подчеркивания.

При использовании имени переменной ссылаются на сам «ящик». Если нужно сослаться на содержимое ящика, используйте знак доллара, например, так: $var. В Windows PowerShell вам часто будут встречаться переменные со знаком доллара, так как весь смысл в его использовании заключается в получении содержимого переменных. Вместе с тем, надо помнить, что знак доллара не является частью имени переменной. Это всего лишь подсказка для Windows PowerShell, что вам требуется содержимое, а не сам ящик. Вот несколько примеров:

  1. $var = ‘hello’
  2. $number = 1
  3. $numbers = 1,2,3,4,5,6,7,8,9

В примерах показано, как назначать переменным значения с использованием оператора присвоения (=). В последнем примере создается массив, потому что Windows PowerShell интерпертирует разделенные запятыми списки как массивы, или наборы элементов. В первом примере присваивается объект, представляющий собой строку, а вся строка заключается в кавычки.

Есть одна особенность Windows PowerShell, которая может вводить в заблуждение новичков. Windows PowerShell не «понимает», какой смысл связывается с именем переменной. Имя $computername не «говорит» оболочке, что в переменной хранится имя компьютера.

Аналогично имя $numbers не говорит оболочке, что переменная будет содержать более одного числа. Оболочке также все равно, какое число вы используете, — единственное или множественное. Для оболочки следующее выражение:

  1. $numbers = 1

…правильное и ничем не отличается от такого:

  1. $numbers = ‘fred.’

Вместе с тем, если переменная содержит несколько значений, для получения одного из них можно задействовать специальный синтаксис. Чтобы получить первый элемент, нужно использовать выражение $numbers[0], второй — $numbers[1], а последний элемент изображается так: $numbers[-1], предпоследний — $numbers[-2] и так далее.

Кавычки

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

Во-первых, это делают, когда нужно вставить содержимое переменной в строку. Только при наличии двойных кавычек Windows PowerShell будет искать знак «$» и предполагать, что все, что следует после этого знака и до первого символа, который не может быть частью имени переменной, является именем переменной. Вместо знака доллара с именем переменной будет вставлено ее содержимое.

  1. $name = ‘Don’
  2. $prompt = «My name is $name»

Переменная $prompt содержит строку «My name is Don», потому что $name заменяется содержимым этой переменной. Это замечательный прием — соединение строк вместо их конкатенации.

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

  1. $debug = «`$computer contains $computer»
  2. $head = «Column`tColumn`tColumn»

В первом примере первый знак доллара $ отменяется. Обратная кавычка отменяет его значение как аксессора переменной. Если переменная $computer содержит строку «SERVER», тогда в $debug будет содержаться такая строка: «$computer contains SERVER».

Во втором примере «`t» представляет собой символ табуляции, поэтому Windows PowerShell разместит между словами Column знаки табуляции. Подробнее об управляющих символах см. веб-страницу.

Наконец, двойные кавычки используются, когда строка должна содержать одинарные кавычки:

  1. $filter1 = «name=’BITS'»
  2. $computer = ‘BITS’
  3. $filter2 = «name=’$computer'»

В этом примере создается строка «name=’BITS’». Все необходимое заключается в двойные кавычки. В $filter1 и $filter2 содержится одно и то же, но в $filter2 значение задается с использованием уловкой с заменой переменной в двойных кавычках. Заметьте, что значение имеет только самая «внешняя» пара кавычек. Одинарные кавычки оболочку Windows PowerShell не интересуют. Эти одинарные кавычки представляют собой простые литеральные символы. Windows PowerShell их не интерпретирует.

Члены и переменные объектов

В Windows PowerShell все состоит из объектов. Даже простая строка, такая как «name», является объектом типа System.String. Чтобы узнать тип объекта (то есть, что представляет собой объект), а также его членов, к которым относятся его свойства и методы, достаточно передать объект в Get-Member по конвейеру:

  1. $var = ‘Hello’
  2. $var | Get-Member

Используйте точку после имени переменной, чтобы сказать оболочке: «Мне не нужен доступ ко всему объекту в переменной, а только к одному из его свойств или методов». После точки укажите нужное свойство или имя метода.

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

  1. $svc = Get-Service
  2. $svc[0].name
  3. $name = $svc[1].name
  4. $name.length
  5. $name.ToUpper()

Обратите внимание на вторую строчку. Она начинается с обращения к первому элементу переменной $svc. Точка означает, что нам не нужен весь объект, а только его свойство или метод. В данном случае нужно свойство name. В пятой строке показано, как обращаться к методу, указывая его имя после точки, а также пару скобок.

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

  1. $service = ‘bits’
  2. $name = «Service is $service.ToUpper()»
  3. $upper = $name.ToUpper()
  4. $name = «Service is $upper»

На второй строке $name содержит«Service is BITS.ToUpper()», а в четвертой строке — «Service is BITS».

Скобки

Помимо указания на методы объектов, скобки также служат в Windows PowerShell маркерами, определяющими порядок выполнения, — как в обычных алгебраических выражениях. Иначе говоря, скобки указывают оболочке, что нужно выполнять в первую очередь. Выражение в скобках заменяется тем, что получается в результате вычисления этого выражения. Вот несколько задачек на сообразительность:

  1. $name = (Get-Service)[0].name
  2. Get-Service -computerName (Get-Content names.txt)

В первой строке $name содержит имя первой службы в системе. Чтобы понять этот пример, придется немного напрячь мозги. Начнем с выражения в скобках. Windows PowerShell начнет анализ именно с этого места. Get-Service разрешается в набор, или массив, служб. Выражение [0] позволяет получить первый элемент массива, которым будет первая служба. Так как за этим следует точка, мы знаем, что идет обращение к свойству или методу этой службы, а не ко всему объекту. Наконец мы извлекаем только имя службы.

Во второй строке выражение в скобках читает содержимое текстового файла. Если файл содержит имена компьютеров — по одному в строке, Get-Content вернет массив имен компьютеров. Они передаются в параметр –computerName командлета Get-Service. В данном случае оболочка передаст результат любого выражения в скобках, возвращающего массив строк, в параметр –computerName, потому что последний создан принимать массивы строк.

Область действия

Область действия — это понятие в программировании, служащее в качестве системы «контейнеризации». Такие вещи как переменные, псевдонимы, диски и другие элементы Windows PowerShell, все хранятся в области действия. Оболочка поддерживает иерархию областей действия и определяет ряд правил, определяющих порядок взаимодействия и обмена информацией между областями действия.

Сама оболочка является одной областью действия, которая называется глобальной областью действия. При выполнении сценария он создает новую область действия и выполняется в ней. Все созданное сценарием, например новые переменные, размещаются в области действия сценария. Он недоступен из оболочки верхнего уровня.

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

  1. New-PSDrive -PSProviderFileSystem -Root C: -Name Sys
  2. Dir SYS:

После выполнения сценария вручную выполните команду Dir SYS:. Вы получите ошибку. Причина в том, что диск SYS: был создан в сценарии. По окончании работы сценария все им созданное было уничтожено. Диск SYS: больше не существует. Не все в оболочке работает в собственном диапазоне. Такие элементы, как модули всегда обрабатываются глобально. Модуль, загруженный сценарием, остается таковым по окончании работы сценария.

Если в области действия предпринимается попытка обратиться к чему-то, что не было создано в ней, Windows PowerShell обращается к следующей области действия более высокого уровня («родительской»). Вот почему псевдоним Dir сработал в созданном вами сценарии. Хотя Dir не существовал в области действия сценария, он существовал в области действия более высокого уровня — в глобальной области действия. В области действия можно создавать элементы с именами, которые существуют в области более высокого уровня. Вот еще один сценарий для выполнения:

  1. Dir
  2. New-Alias Dir Get-Alias
  3. Dir

Это кажется странным, но при первом выполнении Dir каталог не существовал в области действия сценария. Был использован псевдоним Dir более высокого уровня. Этот псевдоним указывает на Get-ChildItem, поэтому было показано знакомое содержимое каталога.

Затем сценарий создал новый псевдоним по имени Dir, который уже указывает на Get-Alias. Именно эта команда выполнялась во втором случае. Все это никак не повлияло на псевдоним Dir верхнего уровня. Попытайтесь выполнить Dir в оболочке после запуска предыдущего сценария и вы снова получите список содержимого каталога.

В областях действия особенно легко запутаться, когда речь идет о переменных. Как правило, из определенной области действия никогда не следует обращаться к элементам за ее пределами, особенно к переменным. Есть синтаксис для выполнения таких операций, например можно использовать $global:var для принудительного обращения к переменной $var глобальной области действия, но это очень плохой способ, применение которого допустимо только в очень специфических обстоятельствах.

Язык сценариев Windows PowerShell

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

Несмотря на свою простоту, язык Windows PowerShell более чем эффективен для своих задач. Сейчас я расскажу об основных сценарных конструкциях, но вы всегда можете получить более подробные сведения, обратившись к соответствующей about-статье в оболочке. Например, help about_switch содержит информацию о конструкции Switch, а help about_if —о конструкции If. Чтобы получить список всех about-статей, выполните команду help about*.

Конструкция If

Это основная конструкция Windows PowerShell для принятия решений. Полная ее форма выглядит так:

  1. If ($this -eq $that) {
  2.   # commands
  3. } elseif ($those -ne $them) {
  4.   # commands
  5. } elseif ($we -gt $they) {
  6.   # commands
  7. } else {
  8.   # commands
  9. }

Ключевое слово «If» является обязательной частью конструкции. Результат вычисления следующего за ним выражения должен быть True или False. Windows PowerShell всегда интерпретирует ноль как False, а любое ненулевое значение как True.

Windows PowerShell также различает встроенные переменные $True и $False, которые представляют указанные булевы значения. Если выражение в скобках равно True, тогда выполняются команды в следующих далее фигурных скобках. Если выражение равно False, эти команды не выполняются. Это минимально необходимый состав конструкции If.

Можно пойти чуть дальше, задав один или больше разделов ElseIf. Они работают так же, как и конструкция If. У них есть собственное выражение в скобках. Если оно равно True, выполняются команды в следующих за выражением фигурных скобках. В противном случае команды не выполняются.

Завершить конструкцию можно блоком Else, который выполняется, если не выполнился ни один из предыдущих блоков команд.  Выполнится только первый блок команд, для которого выражение в скобках равно True. Например, если $this не равно $that, а $those не равно $them, тогда будут выполнены только команды в четвертой строке. Windows PowerShell даже не станет вычислять выражение для elseif в пятой строке.

Символ «решетка» (#) служит для выделения комментариев, то есть Windows PowerShell игнорирует весь текст от этого символа до следующего возврата каретки. Также обратите внимание на аккуратное форматирование описанных конструкций. Некоторые форматируют текст так:

  1. if ($those -eq $these)
  2. {
  3.   #commands
  4. }

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

В среде Windows PowerShell ISE для этой цели можно использовать клавишу Tab, при нажатии которой по умолчанию делается отступ размеров в четыре пробела. Отступы в коде — это базовое требование к написанию кода. Если этого не делать, в объемных сценариях будет очень сложно не ошибиться при расстановке фигурных скобок. Ну и не стоить говорить, что даже новички Windows PowerShell будут насмехаться над вашим текстом без отступов. Посмотрите на этот плохо форматированный сценарий:

  1. function mine {
  2. if ($this -eq $that){
  3. get-service
  4. }}

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

  1. function mine {
  2.  if ($this -eq $that){
  3.   get-service
  4.  }
  5. }

Оболочка не требует, чтобы закрывающие фигурные скобки размещались на отдельных строках, но для восприятия человеком такой формат намного удобнее. Аккуратно соблюдая форматирование, вы избавитесь от многих проблем при работе со сценариями.

Конструкция Do While

Это конструкция цикла в Windows PowerShell. Она служит для многократного выполнения блока команд, пока условие равно True или не станет True. Вот самый простой случай:

  1. Do {
  2.   # commands
  3. } While ($this -eq $that)

В этом варианте конструкции команды в фигурных скобках выполнятся по крайней мере один раз. Условие While вычисляется не ранее, чем первый раз выполнится блок команд. Можно перенести While — тогда команды будут выполнены, только если с самого начала условие равно True:

  1. While (Test-Path $path) {
  2.   # commands
  3. }

Заметьте, что во втором примере не используется оператор сравнения, например -eq. Причина в том, что командлет Test-Path по определению возвращает True или False, поэтому для нормальной работы выражения эти значения не нужно ни с чем сравнивать.

Выражение в скобках в этой конструкции вырождается до простого значения True или False. Именно это происходит, когда вы используете команду, которая всегда возвращает True или False, например Test-Path. Как всегда, есть соответствующая about-статья, где можно найти другие примеры использования этой конструкции.

Конструкция ForEach

Работа этой конструкции похожа на поведение командлета ForEach-Object. Различия только в синтаксисе. Задача ForEach — принять массив (или набор, что в Windows PowerShell равносильно массиву) и выполнить его перечисление, чтобы можно было каждый раз работать с одним объектом:

  1. $services = Get-Service
  2. ForEach ($service in $services) {
  3.   $service.Stop()
  4. }

Новички могут очень легко запутаться с этой конструкцией. Помните, что множественное число слова «services» в английском для Windows PowerShell ничего не значит. Переменная называется именно так, чтобы напоминать, что содержит одни или несколько служб. Если это множественное число, то это не значит, что оболочка будет как-то особо его обрабатывать.

Ключевое слово «in» во второй строке является частью синтаксиса ForEach. Имя $service — это просто произвольное имя переменной. С таким же успехом в этом месте могло быть им $fred или $coffee.

Windows PowerShell будет повторно выполнять команды в фигурных скобках по отношению к каждому очередному объекту во второй переменной ($services). Каждый раз оболочка будет принимать один объект из второй переменной ($services) и помещать его в первую переменную ($service).

В конструкции первую переменную ($service) нужно использовать как содержащую единичный объект. В третьей строке точка означает, что нужен не весь объект, а только один из его членов — метод Stop.

Иногда бывает так, что использование ForEach желательно и даже неизбежно. Однако если у вас уже есть опыт программирования, вы можете прибегать к ForEach, когда этого лучше не делать. В предыдущем примере лучше не использовать ForEach. Разве не проще сделать так:

  1. Get-Service | Stop-Service

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

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

Другие конструкции

В Windows PowerShell есть ряд других конструкций, в том числе Switch, For и другие. Они описаны в about-статьях оболочки. Иногда их можно заменять уже описанными конструкциями. Например, можно заменить Switch конструкцией If с несколькими разделами ElseIf. For можно заменить ForEach или даже командлетом ForEach-Object. Вот пример цикла, который выполняется ровно десять раз:

  1. 1..10 | ForEach-Object -process {
  2.   # code here will repeat 10 times
  3.   # use $_ to access the current iteration
  4.   # number
  5. }

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

Функции

Функция — это особый вид конструкции, служащий для объединения группы взаимосвязанных команд для выполнения одной четко определенной задачи. Вообще говоря, можно взять любой сценарий Windows PowerShell и «обернуть» его в функцию:

  1. function Mine {
  2.   Get-Service
  3.   Get-Process
  4. }
  5. Mine

Здесь определена новая функция по имени Mine. Это, в сущности, превращает Mine в команду, так как запустить функцию можно, просто указав ее имя. Именно это и происходит в пятой строке.

Функции обычно располагают в файлах сценариев. Один сценарий может содержать несколько функций. А функции могут содержать в себе другие функции.

Однако в функциях действуют области действия. Это означает, что использовать функцию можно только в той же области действия, в которой она создана. Функция, размещенная в сценарии, доступна только в этом сценарии и только во время его выполнения. По завершении работы сценария функция (как и все остальное в области действия сценария) уничтожается. Вот пример:

  1. function One {
  2.   function Two {
  3. Dir
  4.   }
  5.   Two
  6. }
  7. One
  8. Two

Представьте, что вы разместили этот текст в файле сценария и выполнили его. В седьмой строке выполняется функция One, определение которой начинается на первой строке. В пятой строке выполняется функция Two, определение которой начинается на пятой строке. Поэтому в результате получим список содержимого каталога — соответствующая команда размещена на третьей строке в функции Two.

Но следующая выполняемая строка (номер восемь) приведет к ошибке. В сценарии нет функции по имени Two. Функция Two спрятана в функции One. Поэтому функция Two существует только в области действия функции One и видна только из последней. Попытка вызвать Two из любого другого места приведет к ошибке.

Параметры в сценарии

Редко сценарии создаются для выполнения в точности одной и той же задачи при каждом запуске. Чаще сценарии содержат изменяемые данные или их поведение может меняться в зависимости от входных данных. Эти вариации можно реализовать с помощью параметров.

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

  1. param (
  2.   [string]$computername,
  3.   [string]$logfile,
  4.   [int]$attemptcount = 5
  5. )

Здесь определяются три параметра. В сценарии они используются как любые другие переменные. Вы наверняка заметили, что в пятой строке я присвоил параметру $attemptcount значение по умолчанию. Это значение будет заменено значением входного параметра, но если он не будет задан, сценарий будет выполняться со значением по умолчанию.

Вот несколько способов запуска сценария (предполагается, что сценарий содержится в файле Test.ps1):

  1. ./test -computername SERVER
  2. ./test -comp SERVER -log err.txt -attempt 2
  3. ./test SERVER err.txt 2
  4. ./test SERVER 2
  5. ./test -log err.txt -attempt 2 -comp SERVER

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

  • В первой строке я задал только один из параметров, поэтому $logfile будет пустым, а $attemptcount будет содержать 5, значение по умолчанию.
  • Во второй строке я задал все три параметра, но при этом использовал сокращенные имена. Как и в командлетах, достаточно задать только начало имени параметра, которого достаточно для того, чтобы оболочка Windows PowerShell «поняла», о чем идет речь.
  • В третьей строке снова заданы все три параметра, но теперь они заданы по позициям, без использования имен параметров. Насколько я помню, если параметры задавать точно в том порядке, в каком они определены в сценарии, все работает нормально.
  • В четвертой строке показано, что происходит, если не соблюдать осторожность. Здесь $computername получит значение «SERVER», $logfile будет содержать 2, а $attemptcount — 5. Это не совсем то, что мне было нужно. Если не использовать имена параметров, теряется гибкость. Также посторонним людям становится сложнее понять, что вы имели в виду, а это в свою очередь усложняет устранение возможных неполадок.
  • В пятой строке приведен лучший пример. Здесь я указал параметры не в том порядке, в котором они определены, но это не страшно, потому что я указал их имена. В общем случае рекомендуется использовать имена параметров — это дает дополнительную гибкость. Вам не нужно будет помнить порядок, в котором они определены.

Более сложные сценарии

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

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

  1. [CmdletBinding()]
  2. param (
  3.   [Parameter(Mandatory=$True)]
  4.   [string]$computername,
  5.   [Parameter(Mandatory=$True)]
  6.   [string]$logfile,
  7.   [int]$attemptcount = 5
  8. )

Я добавил всего лишь инструкцию [CmdletBinding()] в первой исполняемой строке кода в сценарии. Перед этой строкой не разрешается ничего размещать кроме комментариев. Я также присоединил к своим двум параметрам инструкцию [Parameter()], где указал, что они обязательны. Теперь если кто-то попытается выполнить сценарий, не задав эти параметры, Windows PowerShell предложит ввести эту информацию.

Обратите внимание, что у последнего параметра нет никаких дополнительных инструкций, а все три параметра представляют собой разделенный запятыми список (то есть после первых двух параметров стоят запятые). ). Есть масса другой информации, которую можно задать для параметра и которая доступна в статье.

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

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

PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.

Для запуска интерфейса командной строки введите powershell в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.

Изображение Windows Power Shell ISE

Среда разработки Windows PowerShell ISE

Написание и запуск скриптов

Скрипты сохраняются в виде файлов с расширением .ps1. Несмотря на то, что PowerShell уже давно является нативной частью ОС Windows, вы не сможете запустить его скрипты простым двойным щелчком. Для этого надо кликнуть правой кнопкой по скрипту и выбрать «Запустить в PowerShell».

Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy. Результатом будет одно из следующих значений:

  • Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
  • AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
  • RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
  • Unrestricted — можно запускать любые скрипты.

Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy:

Команда Set-ExecutionPolicy в PowerShell

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

Командлеты

Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:

  • существуют системные, пользовательские и опциональные командлеты;
  • результатом выполнения командлета будет объект или массив объектов;
  • командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
  • командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser, get-aduser и gEt-AdUsEr;
  • в качестве разделителя используется символ ; .

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

  • Get-Process — отобразить текущие процессы, запущенные на компьютере;
  • Get-Service — отобразить список служб и их статус;
  • Get-Content — отобразить содержимое указанного файла, например Get-Content C:WindowsSystem32driversetchosts.

При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.

Команда Get-Help-Category в PowerShell

Результат выполнения команды Get-Help-Category

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

Параметры

У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W. Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member.

Например, Get-Process | Get-Member:

Команда Get-Member в PowerShell

Список параметров командлета Get-Process

Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples. Встроенное руководство по PowerShell покажет, для чего используются разные параметры:

Команда -Examples

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

Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help можно просто написать Help — эта команда также вызовет встроенное руководство по PowerShell.

При написании больших скриптов или коллективной разработке можно пользоваться комментариями. Каждый комментарий начинается с символа #, а блок комментариев ограничивается комбинациями символов <# и #> в начале и в конце соответственно.

Конвейер

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

  • GetService | SortObject -property Status — сортировка запущенных служб по статусу;
  • “Hello World!” | Out-File C:pstest.txt — запись текста в файл.

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

Get-Service | WHERE {$_.status -eq “Running”} | SELECT displayname

Заключение

Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help — это одна из самых важных команд для начинающих изучать PowerShell.

Если пользуетесь не только Windows, но и Linux, посмотрите статью про команды терминала Linux для начинающих. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.

Перевод статьи «Windows PowerShell Scripting Tutorial for Beginners»

PowerShell is an extensive scripting language capable of automating just about everything, and not just for system administrators. But what if you don’t know what you don’t know yet? In that case, this combination of various PowerShell script examples will help jumpstart your PowerShell scripting adventure.

Not a reader? Watch this related video tutorial!

Not seeing the video? Make sure your ad blocker is disabled.

Prerequisites

This tutorial will be a hands-on demonstration. If you’d like to follow along, be sure you have the following:

  • Any version of Windows 10, but this tutorial uses Windows 10 Enterprise, build 19043.
  • Windows PowerShell version 5.1 or higher would work, but this tutorial uses PowerShell 7.1, and ideally use the latest version of PowerShell available.
  • An editor such as PowerShell ISE or Visual Studio Code with the PowerShell extension.

Creating and Updating Registry Keys and Values

Each application and operating system on your Windows computer is registered in a central location, the Windows Registry. The Windows Registry is composed of values and keys, where keys being the containers for the values.

PowerShell has many built-in commands to help you create, update and modify registry keys and values.

The Windows Registry is a sensitive area of the Windows operating system, so make sure to back up the registry before making changes.

To make changes to the registry, listed below are three different PowerShell commands. Let’s cover some examples of how each of these PowerShell cmdlets works.

  • New-Item – Creates new registry keys.
  • New-ItemProperty – Creates new registry values.
  • Set-ItemProperty – Changes registry key values.

The example script below defines a list of registry keys, checks to see if each key exists. If so, it then updates the registry values inside. If not, it creates the keys and then creates new registry values inside of those keys.

The outcome of the script below disables registry values related to Transport Layer Security (TLS 1.0).

## Defines three registry key paths in an array
$tls10 = 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server', 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client'

## Checks to see if all of the registry keys in the array exists
$tls10check = ($tls10 | Test-Path) -notcontains $false

## If all of the registry keys exist
if ($tls10check -eq $True){
	## Updates four different DWORD registry values to either 0 or 1
	Set-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server' -name 'Enabled' -value '0' -Type 'DWORD'
	Set-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server' -name 'DisabledByDefault' -value '1' -Type 'DWORD'
	Set-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client' -name 'Enabled' -value '0' -Type 'DWORD'
	Set-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client' -name 'DisabledByDefault' -value '1' -Type 'DWORD'
} else { ## If at least one of the registry keys do not exist
	## Creates the missing registry keys skipping the confirmation (Force)
	New-Item 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server' -Force
	New-Item 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client' -Force
	
	## Creates four different DWORD registry values setting the value to either 0 or 1
	New-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server' -name 'Enabled' -value '0' -Type 'DWORD'
	New-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server' -name 'DisabledByDefault' -value '1' -Type 'DWORD'
	New-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client' -name 'Enabled' -value '0' -Type 'DWORD'
	New-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Client' -name 'DisabledByDefault' -value '1' -Type 'DWORD'
}

Starting a Windows Service (If Not Running)

Once you’re done editing the registry, let’s move right along to managing Windows services.

In the below PowerShell script example, you’ll see a great example of performing some comparison logic followed by an action. When run, this script will get the Status of the EventLog service. If the Status is anything but Running, it will write some text to the console and start the service.

If the service is already started, it will tell you so and perform no further actions.

## Define the service name in a variable
$ServiceName = 'EventLog'

## Read the service from Windows to return a service object
$ServiceInfo = Get-Service -Name $ServiceName

## If the server is not running (ne)
if ($ServiceInfo.Status -ne 'Running') {
	## Write to the console that the service is not running
	Write-Host 'Service is not started, starting service'
	## Start the service
	Start-Service -Name $ServiceName
	## Update the $ServiceInfo object to reflect the new state
	$ServiceInfo.Refresh()
	## Write to the console the Status property which indicates the state of the service
	Write-Host $ServiceInfo.Status
} else { ## If the Status is anything but Running
	## Write to the console the service is already running
	Write-Host 'The service is already running.'
}
## Define the service name in a variable
$ServiceName = 'EventLog'

## Read the service from Windows to return a service object
$ServiceInfo = Get-Service -Name $ServiceName

## If the server is not running (ne)
if ($ServiceInfo.Status -ne 'Running') {
	## Write to the console that the service is not running
	Write-Host 'Service is not started, starting service'
	## Start the service
	Start-Service -Name $ServiceName
	## Update the $ServiceInfo object to reflect the new state
	$ServiceInfo.Refresh()
	## Write to the console the Status property which indicates the state of the service
	Write-Host $ServiceInfo.Status
} else { ## If the Status is anything but Running
	## Write to the console the service is already running
	Write-Host 'The service is already running.'
}
Service started successfully.
Service started successfully.

Finding CIM/WMI Classes

CIM is a handy repository of information in Windows, and PowerShell can, by default, query it. Using a combination of CIM cmdlets, you can gather all kinds of handy information from CIM.

To find all of the CIM-related PowerShell cmdlets, run Get-Command -Name *Cim*.

CIM data is broken out in CIM classes. CIM classes hold categories of Windows information. Perhaps you’re looking for some hardware information and discovered that the CIM class has some variation of System in the class name. Using the Get-CimClass cmdlet, you can find all classes matching a particular pattern.

To retrieve one or more CIM classes via the Get-CimClass cmdlet, specify the ClassName parameter with the exact class name or search pattern on a PowerShell command prompt. If you don’t know the whole class name, you can use a wildcard (*). Below, you’ll see the command to find all CIM classes matching the pattern Win32_*System.

Get-CimClass -ClassName Win32_*System
CIM classes, filtered by class name.
CIM classes, filtered by class name.

Querying WMI for Computer Information

Once you’ve found the CIM class you’d like to query, PowerShell now has another cmdlet called Get-CimInstance to help you query information from that class.

Below you’ll find another great PowerShell example script, this time demonstrating a real-world case of querying CIM. This example is querying the Win32_OperatingSystem CIM class on two remote computers at once and creating a CSV file with a few select properties returned from that query.

After finding your desired -ClassName, perhaps you wish to filter the information further where the property names are separated by commas.

## Query the Win32_OperatingSystem CIM instance on both the serv1 and serv2 computers
Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName Serv1,Serv2 |`
## Limit the output to only a few select propeties
Select-Object -Property BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion | `
## Send each CIM instance object to a CSV file called C:FoldersComputers.csv
Export-CSV C:FolderComputers.csv -NoTypeInformation -Encoding UTF8 -Verbose

When the script finishes, you’ll find a CSV file called Computers.csv in the C:Folder directory looking something like this:

BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion
19042,Multiprocessor Free,18,0,0
19012,Multiprocessor Free,18,0,0

Installing Applications

Now that you know how to gather computer information, you can now use that information to tell whether those computers are compatible with certain applications, for example.

Manually installing software on a single computer may be doable, but if you have many computers to install software on, that task soon becomes untenable. To help out, you can create a PowerShell script to install software (if your software supports it) silently.

Perhaps you’re working on a Microsoft Installer (MSI) package, and you’d like to install the software silently. You can install MSI packages via the msiexec.exe utility. This utility isn’t a PowerShell command, but you can invoke it with PowerShell.

Maybe you have an MSI called package.msi in the C:folder directory. To silently install software, you must first know what switches that installer requires to do so. To find the available switches, run the MSI and provide a /? switch. The /? should display each available parameter, as shown below.

You can see below a pop-up window that shows a list of argument parameters available for installing the MSI package.

Windows Installer Argument List
Windows Installer Argument List

Once you know the switches the installer package needs, it’s now time to invoke the msiexec.exe utility. Since msiexec.exe is not a PowerShell command, you must invoke it as an external process. One of the easiest ways to invoke processes with PowerShell is using the Start-Process cmdlet.

The Start-Process has two parameters you’ll need to use in this example; Name and Wait. In this below example, you’ll see that Start-Process is invoking the msiexec.exe utility by using the Name parameter and waiting (Wait) for the process to finish before releasing control back to the console.

Since msiexec.exe needs a few parameters to install the software silently, the example uses the ArgumentList to provide each parameter that msiexec.exe needs to install the software silently.

## Invoke the msiexec.exe process passing the /i argument to indicate installation
## the path to the MSI, /q to install silently and the location of the log file
## that will log error messages (/le).
Start-Process -Name 'msiexec.exe' -Wait -ArgumentList '/i "C:Folderpackage.msi" /q /le "C:Folderpackage.log"'

Handling Errors with a Try, Catch, and Finally Statement

To sum up this PowerShell script example post, let’s end on a topic you can (and should) apply to any PowerShell script; error handling. Error handling “catches” unexpected errors found in your script, making your script more robust and able to execute with fewer hiccups.

Error handling is a big topic that could be explained in an entire book but let’s only cover the basics; the try, catch, and finally statements. Try/catch blocks are blocks of code that PowerShell “monitors” for hard-terminating errors or exceptions.

If code inside a try/catch block produces a hard-terminating error, that exception will be “caught” by a block and specific code run against it. Once the script is finished, either returning an exception or completing successfully, PowerShell will process the finally block.

In the below example, the script creates a File Transfer Protocol (FTP) script file that connects to an FTP server, attempts to upload a file to an FTP server, and then removes the FTP script file once complete.

You’ll see in the example the “functional” code has been wrapped in a try, catch and finally block. For example, if the Out-File cmdlet returns a hard-terminating error, PowerShell will catch that error and return Error: <the error/exception message> and then exit with a code of 1.

Once the script successfully creates the FTP script file, it then attempts to invoke the ftp.exe utility, which executes the commands inside of the FTP script file. If _that

Notice that you’re creating the FTP script file via the Out-File cmdlet with the first try statement. If the try statement failed, the catch statement below would catch the errors. Then the $($_.Exception.Message) property followed by an exit 1 will end the script, displaying the error status.

But if the first try statement succeeds, the following try statement will run the generated FTP script. When the FTP script runs successfully, you will see log output with the successful connection to the FTP server and file download.

Then regardless of the results of the try and catch statements, the finally statement will run and remove the FTP script file.

## Create the try block and create any code inside.
try { 
	## Create the FTP script file using a here string (https://devblogs.microsoft.com/scripting/powertip-use-here-strings-with-powershell/)
	## If Out-File creates the FTP script, it then invokes ftp.exe to execute
	## the script file.	
	$Script = @"
	open localhost
	username
	password
	BINARY
	CD remotefolder
	LCD C:folder
	GET remote.file
	BYE
"@
	$Script | Out-File "C:Folderftp.txt" -Encoding ASCII

	ftp -s:C:folderftp.txt
} catch {
	## If, at any time, for any code inside of the try block, returns a hard-terminating error
	## PowerShell will divert the code to the catch block which writes to the console
	## and exits the PowerShell console with a 1 exit code.
	Write-Host "Error: $($_.Exception.Message)"
	exit 1
} finally {
	## Regardless if the catch block caught an exception, remove the FTP script file
	Remove-Item -Path "C:folderftp.txt"
}

## When the code inside of the try/catch/finally blocks completes (error or not),
## exit the PowerShell session with an exit code of 0
exit 0

As you can see below, running the FTP script was successful.

FTP script output.
FTP script output.

If an exception is caught anywhere inside the try block, you’ll see an error message ($_.Exception.Message) indicating what went wrong.

Error Running FTP Script File
Error Running FTP Script File

Conclusion

Through these PowerShell script examples, you should now get a hint at what’s possible with PowerShell. PowerShell can do so much more than what you learned in this tutorial, so use this tutorial as a springboard to your learning.

How do you think can these script examples improve your workflow? Whatever your answer is, don’t hesitate and start leveling up your scripting skills!

Понравилась статья? Поделить с друзьями:
  • Сценарий агитбригады на день города
  • Сценарий new year christmas
  • Сценарий академия чудес
  • Сценарий net zero
  • Сценарий агитбригады на 9 мая день победы