Powershell последовательное выполнение команд: Как в powershell запустить последовательное выполнение команд? — Хабр Q&A
Содержание
Windows PowerShell
- Bot
- 04.10.2021
- 6 342
- 0
- 6
- 6
- 0
- Содержание статьи
- Вступление
- Что такое Powershell?
- Знакомство с PowerShell
- Параметры
- Конвейер
- Получение сведений об объектах
- Безопасность
- Псевдонимы
- Диски PowerShell
- Профили PowerShell
- Работа с объектами WMI
- Заключение
- Добавить комментарий
Вступление
Немалая часть задач, связанных с обслуживанием локальных вычислительных сетей, представляет собой выполнение рутинных операций, ручная реализация которых может потребовать значительного времени. Вероятно, решения, позволяющие автоматизировать выполнение административных задач, которые могли бы повысить производительность, возникли почти сразу же с появлением профессии системного администратора.
Наиболее распространенным средством «экономии времени и избавления от головной боли» стала запись и последовательное пакетное исполнение необходимых операций — исполнение сценариев или скриптов в интерпретаторе команд операционной системы.
Попытки улучшить состояние дел в области управления и администрирования Windows с помощью командного интерфейса привели не к адаптации чужеродного для системы языка сценариев или созданию супер-утилиты, работающей в DOS, а к появлению PowerShell – новой командной оболочки.
В составе MS-DOS и Windows 9x таким интерпретатором, позволяющим выполнять обработку пакетных файлов (bat-файлов), являлся command.com, впоследствии (начиная с выхода Windows NT) замененный cmd.exe. Позднее появился Windows Script Host.
Тем не менее, процесс написания и выполнения сценариев в ОС Windows не развит так хорошо, как, например, в UNIX-системах. Одна из причин этого – сам графический интерфейс ОС Windows, видимо и сделавший ее столь популярной среди обычных, не корпоративных пользователей. Возможность управления некоторыми элементами среды Windows с помощью графического интерфейса не всегда можно реализовать с помощью системных утилит, выполняемых в командной строке. С другой стороны, возможности каких-то системных программ, поставляемых в составе Windows, не всегда представлены в GUI. К тому же интерпретаторы в Windows имеют довольно ограниченный набор команд, «зашитых» в саму оболочку. Windows Script Host не интегрирован с командной строкой и сам по себе представляет потенциальную опасность – его использует достаточно большое количество вредоносных программ.
Попытки улучшить состояние дел в области управления и администрирования Windows с помощью командного интерфейса привели не к адаптации чужеродного для системы языка сценариев или созданию супер-утилиты, работающей в DOS, а к появлению Windows PowerShell – новой командной оболочки. По некоторым данным, ее появление связано с использованием платформы .NET при создании командного интерфейса для WMI. В данный момент PowerShell является отдельным приложением, который можно установить на любую систему, использующую платформу . Net 2.0 (Windows XP, Vista, Server 2003). Начиная с Server 2008, PowerShell будет являться встроенным компонентом Windows-систем. Если же у вас не Server 2008, для знакомства с PowerShell предварительно необходимо будет его загрузить (возможно, вам понадобится и установка .NET).
Что такое Powershell?
PowerShell — расширяемое средство автоматизации от Microsoft с открытым исходным кодом, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев
Знакомство с PowerShell
Запустив PowerShell, вы не обнаружите поначалу никаких различий между ним и cmd.exe (разве что цвет фона окна у PowerShell по умолчанию — синий). Более того, вскоре вы обнаружите, что операции копирования/вставки в PowerShell реализованы также безобразно, как и в cmd.exe. Но первое впечатление о схожести этих оболочек, скажем так, не совсем соответствует действительности.
То обстоятельство, что работа оболочки PowerShell основана на . NET Framework, является главным ее отличием от предыдущих командных оболочек Windows. PowerShell полностью объектно-ориентирована. Результатом выполнения команды в PowerShell является не некий «текст сам по себе», а объект платформы .NET. Этот объект представляет собой собственно данные и имеет набор присущих ему свойств и методов.
Внутренние команды (точнее, командные структуры) для работы с объектами в PowerShell называются командлетами. Для них придумано специальное единообразное именование в виде комбинации действие-цель. Например, для получения данных используется действие “set”, для получения – “get”, для вывода — “out” и т. д. Цель – это тип объекта, к которому будет применено действие. Командлеты можно рассматривать как мини-программы, исполняемые в среде PowerShell. Для повышения функциональности можно создавать собственные командлеты или устанавливать командлеты сторонних разработчиков. Кроме командлетов, PowerShell позволяет выполнять функции, внешние сценарии (хранятся в файлах с расширением ps1
) и внешние исполняемые файлы.
В состав PowerShell включена довольно обширная справочная система. Для начала работы с ней можно выполнить команду Get-Help
.
Для получения детальной справки по какому-либо командлету или разделу основных сведений, необходимо указать его название в качестве параметра команды.
Параметры
Строго говоря, следуя духу единообразного именования в PowerShell, все передаваемые командлету имена параметров должны следовать за символом «-». Однако для простоты написания названия некоторых параметров можно опускать. Например, для вызова справки по командлету Get-Content вместо полного указания
Get-Help –name Get-Content
можно ввести команду
Get-Help Get-Content
Параметр может иметь какое-либо значение (в только что приведенном примере значением параметра name являлось Get-Content
) или не иметь его. В этом случае он является аналогом переключателя какой-либо функциональности команды. Например, если необходимо получить полную информацию о командлете Get-Content
, введите
Get-Help Get-Content –Detailed
Конвейер
В PowerShell реализован механизм передачи данных от одного процесса другому или вывод их в файл. Поскольку, как отмечалось выше, PowerShell оперирует не текстом, а объектами, при перенаправлении элементом обмена информации является объект, вместе со своей структурой. Такая возможность позволяет оперировать с объектами — отбирать их по заданному фильтру, сортировать, группировать их и т. д. Для организации такого конвейера (в документации на английском языке используется термин pipeline — трубопровод или канал) в тексте сценария используется знак вертикальной черты. При обнаружении такого знака интерпретатор передает объекты от одного командлета другому в качестве входных параметров.
В качестве примера конвейера и возможности получать доступ к свойствам передаваемых по нему объектов, приведем следующую ситуацию. Для проверки, не выполняются ли на компьютере некие подозрительные программы, мы хотим получить список всех запущенных процессов, получить пути и названия файлов, их запускающих, а также посмотреть дату создания таких файлов. В дополнение, отсортируем такой список по дате создания в убывающем порядке и отберем 10 наиболее «свежих» из них. Добавим к выводной информации также время последней модификации файла. Процессы с именами «System» и «Idle» из рассмотрения исключим, так как они не содержат пути к файлам.
Как говорится, хорошо сформулированный вопрос — уже половина решения. Взгляните:
Get-Process | where-Object {"System", "Idle" -notContains $_.Name} | Get-Item | Sort CreationTime -desc | Select Directory, Name, CreationTime, LastWriteTime -first 10
Вводя код, вы всегда можете разбить строку, поставив в месте переноса знак «`» после пробела. Можно даже просто нажать клавишу Enter, не закончив строки. В этом случае PowerShell изменит приглашение на >>, давая пользователю понять, что интерпретатор считает код не завершенным и ожидает окончания его ввода.
Как и множество других скриптовых языков, PowerShell позволяет использовать переменные. Обозначением переменной служит знак «$». В случае передачи объекта по конвейеру, переменная $_ указывает на сам передаваемый объект.
Рассмотрим действия кода «по шагам». Сначала мы получаем список процессов с помощью командлета Get-Process
. Эти данные передаются по конвейеру далее и фильтруются по условиям, заданным в where-Object
(мы откидываем процессы с именами «System» и «Idle»).
Следующий элемент конвейера — Get-Item
возвращает атрибуты отобранных объектов. Осталось их отсортировать (время создания в убывающем порядке) и выбрать интересующие нас значения (имена папки и исполняемого файла, время создания и последней модификации файла). Последний параметр, -first 10
указывает, что выводиться будут лишь первые 10 элементов из списка объектов. Попробуем выполнить:
Замечательно, то что надо. Однако при попытке выполнить тот же код в среде Windows XP или Server 2003 обнаружилось, что там это выглядит не столь гладко:
При просмотре результатов выполнения
Get-Process | Select Path
выяснилось, что пути двух процессов — winlogon и csrss — в Windows XP и Server 2003 PowerShell интерпретирует как \??\C:\WINDOWS\system32\. За разъяснением такого поведения я обратился к Василию Гусеву, специалисту по PowerShell. Он пояснил, что эти процессы не используют Win32API, и столь разная реакция на них в XP/Vista со стороны .NET, вероятно, вызвана различием платформ этих операционных систем.
Решив, что использовать механизмы обработки ошибок (в части обхода «непонятного» пути с подавлением вывода сообщения об ошибке) или исключения из списка процессов winlogon и csrss в данном случае не годится (возможно, они инфицированы, а дату их модификации в результатах мы уже не увидим), команды были изменены следующим образом:
Get-Process | ForEach-Object { if ($_.Path -ne $NULL ) { Get-Item ($_.Path -replace "\\\?\?\\", "") } } | Sort CreationTime -desc | Select FullName, Name, CreationTime, LastWriteTime -first 10
А читатель может получить некоторое представление об использовании в PowerShell условий и регулярных выражений. Небольшие пояснения к коду. На втором этапе конвейера применен командлет ForEach-Object
, позволяющий выполнить заданную операцию для каждого объекта из набора, передаваемого на его вход. Как указывалось выше, текущий объект, над которым выполняется операция, представлен переменной $_. В качестве заданной операции здесь выступает условие вида if (условие){исполняемый код, если условие истинно}. Так же, как и в cmd.exe, для операторов сравнения используются не символы вида < или >, а аббревиатуры — в данном случае это «не равно»(not equal): -ne. Итак, если путь процесса содержит какое-либо значение (в случае с «System» и «Idle» путь просто отсутствует), с помощью функции replace все символы «\??\» в пути будут удалены (пожалуй, более детально затрагивать вопрос регулярных выражений мы пока не будем), а командлет Get-Item
предоставит доступ к свойствам текущего процесса. Ну а далее — все, как и в первом примере. Результат выполнения теперь одинаков:
Получение сведений об объектах
Возможно, у читателя уже возник вопрос — а как, вообще говоря, можно узнать, какую информацию можно получить в результате выполнения той или иной команды? Какие действия можно произвести с полученными данными? Например, в вышеописанном случае, откуда можно было узнать, что мы сможем получить дату создания файла? Одним из простых способов анализа объекта, возвращаемого командой, является передача этого объекта на вход командлета Get-Member
. Этот командлет выводит сведения о типе объекта и всех его элементов. Как правило, объекты имеют большое количество разнообразных свойств и результатом работы Get-Member
может стать весьма объемный текст, который не очень удобно просматривать. В этом случае можно либо разделять информацию на части, либо ее отфильтровывать. Пример получения информации об объекте, возвращаемом командлетом Get-Process
, просмотр которой можно осуществлять постранично:
Get-Process | Get-Member | Out-Host -Paging
По заполнении страницы, пользователь может выбрать один из вариантов — вывести еще одну страницу, вывести еще одну строку или прекратить вывод данных.
Фильтрация данных выполняется при помощи параметра MemberType, определяющего, сведения какого рода должны быть выведены. Например, команда
Get-Process | Get-Member -MemberType Properties
выведет лишь свойства объекта, а
Get-Process | Get-Member -MemberType Methods
— лишь его методы. Еще один способ посмотреть свойства объекта — присвоить переменной объект, затем набрать в консоли имя переменной, поставить точку и нажать клавишу Tab. С каждым нажатием клавиши PowerShell будет перебирать и подставлять методы и свойства объекта. Перебор в обратную сторону возможен с помощью сочетания клавиш Shift+Tab.
Безопасность
Как уже отмечалось, использование сценариев VBScript/JScript представляет потенциальную опасность для системы — для их исполнения достаточно щелкнуть по значку мышью. Опасность еще более возрастает, если пользователь вошел под учетной записью, входящей в группу администраторов. В PowerShell скрипт с расширением ps1
невозможно запустить на исполнение с помощью мыши — в системе такой файл будет открыт не в командной оболочке, а в Блокноте. Для запуска сценария необходимо запустить саму оболочку PowerShell, ввести имя файла и нажать клавишу Enter.
В новой оболочке так же невозможна подмена команд. Суть этого приема, применяемого злоумышленниками, заключается в следующем. Обычно у пользователя, не имеющего прав администратора, есть некоторые папки с разрешениями на запись и выполнение файлов. Характерный пример — папка C:\Documents and Settings\имя_пользователя. Вредоносная программа создает в такой папке исполняемый файл с именем, совпадающим с именем команды оболочки или именем исполняемой системной программы. К примеру, я создал в «своей» папке документов ipconfig.vbs, выводящий простое сообщение. Теперь, если, запустив cmd.exe, и находясь в своей папке, я попытаюсь выполнить команду Windows ipconfig
, то получу вот такой результат:
Для полноты иллюстрации можно поместить в папку с документами и исполняемый файл, переименованный в нашем случае в ipconfig.exe. Тогда даже при вызове с указанием расширения будет запускаться файл из текущей папки, а не из \system32. С PowerShell такой фокус не пройдет — для вызова скрипта, путь к которому не совпадает с путями, заданными в системной переменной %Path, необходимо явно указать его расположение. Даже в том случае, когда скрипт расположен в папке, являющейся для оболочки текущей, необходимо указать путь в таком виде: .\имя_файла. Точка с обратным слешем указывают интерпретатору на текущую папку.
Еще одним механизмом обеспечения безопасности является политика выполнения сценариев. Изначально оболочка настроена так, что даже при правильном вызове сценария его выполнение будет запрещено, а пользователь получит соответствующее сообщение. Политика выполнения может переключаться в один из четырех режимов:
- Restricted — настройка по умолчанию, запуск любых сценариев запрещен
- AllSigned — разрешен запуск сценариев, имеющих цифровую подпись надежного издателя; сценарии, созданные пользователем, также должны быть заверены центром сертификации
- RemoteSigned — разрешен запуск сценариев, если они не являются доверенными, но созданы локальным пользователем; сценарии, загруженные из Интернета, не имеющие подписи, не исполняются
- Unrestricted — разрешен запуск любых сценариев
Текущий режим политики можно узнать, выполнив команду Get-ExecutionPolicy
в оболочке. Для изменения режима выполните команду Set-ExecutionPolicy
с необходимым названием политики в качестве параметра.
Также к инструментам, помогающим повысить безопасность при работе с PowerShell, я бы отнес параметры команд из разряда «а что будет, если…». Их два — whatif
и confirm
. Первый позволяет определить, какое действие и с каким объектом будет произведено, однако само действие реализовано не будет. Что-то вроде моделирования. Второй перед выполнением действия будет запрашивать подтверждения пользователя, и в случае утвердительного ответа — запускать необходимую команду фактически. То есть, такой вид подстраховки.
Приведу, пожалуй, наиболее яркий и забавный пример использования этих параметров. Если пользователь попытается выполнить команду:
Get-Process | Stop-Process
то через несколько секунд его будет ждать синий экран со STOP-ом. PowerShell, как и следует из текста команды, последовательно начнет «прибивать» все запущенные в системе процессы, что и приведет к ее критическому останову. Если же запустить:
Get-Process | Stop-Process -whatif
ничего страшного не произойдет — просто PowerShell покажет, что бы он сделал, если бы команда выполнялась без ключа -whatif
:
Псевдонимы
Оболочка имеет встроенный механизм псевдонимов команд. С одной стороны, псевдонимы используются для упрощения ввода команд. Как правило, в этом случае в качестве псевдонима используется сокращенное наименование командлета (например, gc
для Get-Content
или fl
для Format-List
). С другой стороны, этот механизм обеспечивает совместимость интерфейсов различных командных интерпретаторов. К примеру, имея опыт работы с cmd.exe, вы привыкли выводить содержимое папки с помощью команды dir. Выполнение этой команды в PowerShell приведет к тому же результату, хотя на самом деле оболочка вместо псевдонима dir будет выполнять командлет Get-ChildItem
. Список всех доступных псевдонимов можно получить с помощью команды Get-Alias
. Пользователь может создавать собственные псевдонимы, используя команду Set-Alias
.
Диски PowerShell
Так же, как Windows оперирует с данными, используя файловую систему, оболочка PowerShell работает с хранилищами данных, представленных в виде дисков. Физические диски системы являются не единственным встроенным в оболочку видом хранилищ, с которыми обеспечивается взаимодействие. Пользователь может работать с реестром, встроенными переменными и переменными среды, хранилищами сертификатов точно так же, как и с обычными дисками, папками и файлами. Реализация такого взаимодействия и обеспечение абстракций, позволяющих пользователю применять одинаковые команды и методы к различным хранилищам данных, выполняется провайдерами — программами .NET.
Список провайдеров, доступных в данный момент оболочке, можно получить командой Get-PSProvider
. Изначально в PowerShell присутствуют следующие «диски» — псевдонимы (Alias), переменные среды (Env), физические диски системы (C, D, и т. д.), функции, системный реестр, внутренние переменные (Variable) и хранилище сертификатов.
Вот пример чтения содержимого ветки реестра HKLM\Software\Microsoft
Как видно, использованы те же команды, что для получения сведений о файловой системе. Но структура получаемых данных, естественно, различна. Кроме названия и свойств для каждого элемента выводится номер подраздела (SKC) и номер записи (VC). С помощью PowerShell пользователь может просматривать сведения о реестре, добавлять, удалять и модифицировать ключи. Позволю привести себе что-то вроде шпаргалки по работе с элементами реестра:
И код для примера выполнения различных манипуляций с ключами реестра и их параметрами:
# Создаем новый подраздел с именем valks в ветке HKEY_CURRENT_USER\Software New-Item -path HKCU:\Software\valks # Добавляем в созданный раздел новый строковый параметр с именем Param1 и значением StringValue New-ItemProperty -path HKCU:\Software\valks -name Param1 -propertyType String -value StringValue # Создадим подраздел SubFolder New-Item -path HKCU:\Software\valks\SubFolder # Добавляем еще один параметр - Param2 типа DWord и значением 12 New-ItemProperty -path HKCU:\Software\valks -name Param2 -propertyType DWord -value 12 # Получаем список всех параметров Get-ItemProperty HKCU:\Software\valks # Получаем значение параметра Param2 Get-ItemProperty HKCU:\Software\valks | Format-list Param2 # Или можем считать раздел в переменную $key $key = Get-ItemProperty HKCU:\Software\valks # И вывести значение нужного параметра Write-Host "Значение параметра Param2: " $key. Param2 # Изменим значение параметра Param2 на 193 Set-ItemProperty HKCU:\Software\valks -name Param2 -value 193 # Изменим название параметра Param1 на Параметр1 Rename-ItemProperty -path HKCU:\Software\valks -name Param1 -newname Параметр1 # Удаляем Параметр1 Remove-ItemProperty HKCU:\Software\valks -name Параметр1 # Удаляем весь подраздел valks Remove-Item HKCU:\Software\valks
Вот еще небольшой пример в виде функции, которая осуществляет поиск программ, автоматически загружающихся при старте системы. Область поиска определяется массивом, включающим в себя некоторые известные точки автозапуска в реестре. Код содержит комментарии, надеюсь, они пояснят суть работы.
function GetAutoexec ($hives) { # Если функции не передается входной массив ключей реестра, # используем этот: $hives = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run", ` "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", ` "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run" # Выодим заголовок и переносим строку Write-Host "Список автозагрузки`n" # Начинаем перебирать элементы массива - ветви реестра Foreach ($hive in $hives){ # Выводим название ветви зеленым цветом Write-Host "Ветвь $hive" -ForegroundColor Green # Проверяем, существует ли ветвь в реестре if (Test-Path $hive){ # Получаем очередной ключ реестра [Microsoft. Win32.RegistryKey]$param = Get-Item $hive # для каждого ключа... foreach ($p in $param){ # ...получаем список его параметров foreach ($key in $p.getvalueNames()){ # выводим название параметра и его значение "Загрузка $key из " + $p.GetValue($key) } } } # переносим строку Write-Host "`n" } } # осуществляем вызов самой функции GetAutoexec
Пользователь может создавать собственные диски, используя существующие провайдеры. Вот пример создания диска PowerShell с именем Win, содержимое которого будет являться корневой папкой C:\Windows
:
New-PSDrive -Name Win –PSProvider FileSystem -Root "C:\Windows"
После создания диска PowerShell к нему можно обращаться точно так же , как к обычному диску системы.
Однако необходимо знать, что по завершении сеанса работы с PowerShell он будет автоматически удален. Так же, как и псевдонимы, функции и переменные, созданные пользователем в течение сеанса. Для того, чтобы сохранить перечисленные изменения, необходимо создать профиль PowerShell.
Профили PowerShell
Профиль — это файл с расширением ps1
. Фактически, это тот же скрипт, выполняемый оболочкой при ее запуске. Профили в оболочке не создаются автоматически — они должны быть созданы пользователем самостоятельно. Созданные профили будут загружаться при каждом запуске PowerShell, если политикой выполнения разрешено загружать конфигурационные файлы. Возможна обработка до четырех различных профилей. Расположение файлов в порядке последовательности их загрузки:
- %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 — профиль, применяемый ко всем пользователям и оболочкам
- %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1 — профиль, применяемый ко всем пользователям только оболочки PowerShell
- %UserProfile%\My Documents\WindowsPowerShell\profile. ps1 — применяется для текущего пользователя во всех оболочках
- %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 — применяется для текущего пользователя только в оболочке PowerShell
Под различными оболочками здесь нужно учитывать то обстоятельство, что PowerShell может оказаться не единственным приложением, использующим файлы профилей ps1
. Некоторые интегрированные среды разработки (IDE) также могут использовать их. Один из характерных примеров — инструмент PowerGUI, разработанный Quest Software, предоставляющий средства графического интерфейса для работы с PowerShell.
Путь к профилю текущего пользователя только оболочки PowerShell хранится во встроенной переменной $profile. Для его создания выполните команду:
New-Item -Path $profile -ItemType file -force
После создания его можно открыть любым текстовым редактором, например Блокнотом:
notepad $profile
и сделать в нем необходимые изменения. Не забудьте проверить, разрешен ли политикой выполнения запуск скриптов.
Работа с объектами WMI
WMI (Windows Management Interface, интерфейс управления Windows) — набор интерфейсов для управления ОС Windows с помощью специальных компонентов. Возможно управление локальным компьютером, и находящимся в сети. WMI — разновидность Web-Based Enterprise Management (WBEM) и Common Information Model (CIM), разработанная Microsoft. Входит в состав Windows Vista, Windows Server 2003, Windows XP, Windows Me и Windows 2000. Для Windows 95 и Windows 98 доступна в виде отдельно устанавливаемого компонента. Поддерживает использование скриптовых языков, таких как VBScript или Windows PowerShell для управления персональными компьютерами и серверами, работающими под управлением Microsoft Windows.
Объекты WMI являются для PowerShell вполне «родными». Достаточно выполнить команду:
Get-WmiObject -List
чтобы увидеть большое количество классов, обеспечивающих доступ к объектам WMI в оболочке. В случае подключения к WMI на удаленном компьютере, состав классов будет зависеть от ОС и установленных на нем расширений WMI. Для получения сведений о доступных классах на удаленной машине, необходимо указать его IP-адрес или имя в качестве параметра:
Get-WmiObject -List -ComputerName Server
Для успешного подключения на удаленном компьютере должен быть запущен интерфейс WMI, а используемая учетная запись должна входить в группу локальных администраторов.
Если не использовать специальное указание, некоторые сведения не выводятся, видимо из соображений «не захламлять экран». Для получения более детальной информации можно воспользоваться командами форматирования и отбора данных.
PS C:\Documents and Settings\Администратор> Get-WmiObject -Class Win32_OperatingSystem SystemDirectory : C:\WINDOWS\system32 Organization : Nrest BuildNumber : 3790 RegisteredUser : Сергей SerialNumber : 69889-650-3137304-45684 Version : 5. 2.3790 PS C:\Documents and Settings\Администратор> Get-WmiObject -Class Win32_OperatingSystem | Format-List Locale, Version, CurrentTimeZone, OSLanguage, InstallDate Locale : 0419 Version : 5.2.3790 CurrentTimeZone : 180 OSLanguage : 1049 InstallDate : 20081022233211.000000+240
А вот небольшой пример опроса всех компьютеров в локальной сети с адресом 192.168.1.0 и маской подсети 255.255.255.0:
1..254| ForEach-Object -Process { Get-WmiObject -Class Win32_PingStatus -Filter ("Address='192.168.1." + $_ + "'") -ComputerName . } | Select-Object -Property Address,ResponseTime,StatusCode
В первом элементе конвейера генерируется массив чисел от 1 до 254. На втором этапе каждое число из массива подставляется в IP-адрес, который будет пинговаться при помощи средств WMI. Результаты будут выводиться в таблицу с тремя столбцами — адрес хоста, время отклика и статус ответа. В случае ответа хоста возвращается статус с кодом «0».
Заключение
Конечно, в одной статье невозможно описать все возможности PowerShell. К тому же Microsoft продолжает работу над его улучшением — вторая версия должна поддерживать управление удаленными компьютерами непосредственно самой оболочкой. Ожидаются и другие нововведения. Учитывая, что PowerShell будет являться компонентом новых ОС, не приходится сомневаться в том, что сфера его применения в продуктах Microsoft будет только расширяться.
Автор выражает признательность Василию Гусеву за помощь, оказанную при подготовке статьи
Полезные приёмы работы в Windows PowerShell 2
Администратор создание ленивое и по этому они (администраторы) неустанно ищут супер утилиту которая вместо них самих выполняла бы всю их работу ну или основную часть. Наиболее распространенным методом «избавления от головной боли и экономии времени» стала запись и последовательное пакетное исполнение необходимых операций — исполнение скриптов или сценариев в интерпретаторе команд операционной системы, так и был создан Windows PowerShell.
Редактирование в командном окне Windows PowerShell
Windows PowerShell поддерживает те же возможности редактирования вводимых команд, что и в стандартной оболочке cmd.exe Вспомним ключевые:
Клав. комбинация Действие ---------------- -------- <home> В начало текущей строки <end> В конец текущей строки <insert> Переключение между реж. вставки и замены <delete> Удаление символа под курсором <backspace> Удаление символа перед курсором <f7> Список команд вводимых ранее <tab> Авто завершение команд
Работа с буфером обмена Windows: правой кнопкой мыши на заголовке окна PowerShell, меню «Изменить — Пометить«, затем удерживая нажатой клавишу <shift> выделить нужный блок и нажать <enter>. Можно упростить манипуляции с буфером Windows включив режим выделения мышью и быстрой вставки.
* ПРИМЕЧАНИЕ:
Если имеются несколько строк с командами, то достаточно скопировать их все и вставить в окно консоли, команды будут выполнятся поочерёдно — нет необходимости копировать и вставлять строки с командами по одной!
Автоматическое завершение команд Windows PowerShell
Находясь в оболочке Windows PowerShell, можно ввести часть какой-либо команды, нажать клавишу <tab> и система попытается сама дописать полное имя этой команды. Автоматическое завершение команд срабатывает для имен файлов и путей файловых систем до первого найденного совпадения. При повторном нажатии клавиши <tab> выполняется циклический переход по имеющимся возможностям выбора.
В оболочке Windows PowerShell также реализована возможность автоматического завершения путей файловой системы на основании шаблонных символов: ? (любой один символ) и * (любое количество произвольных символов). Например:
cd c:\pro*files
После нажатия на клавишу <tab>
путь будет преобразован в cd 'C:\Program Files'
…
В оболочке Windows PowerShell имеется возможность автоматического завершения имен командлетов и их параметров. Если ввести первую часть имени (глагол) командлета и дефис, после этого нажать клавишу <tab>, то система выдаст имя первого подходящего командлета. Аналогичным образом срабатывает автозавершение и для параметров командлета, например введя имя командлета и дефис, после чего нажать <tab>, то автоматически будет подставлено имя первого подходящего параметра для этого командлета.
Windows PowerShell позволяет автоматически завершать имена переменных. И наконец Windows PowerShell поддерживает автоматическое завершение имён свойств и методов объектов. Например:
$a='test't' $a.len <tab> $a.Length
Система подставила свойство Length, имеющееся у символьных переменных. Если подставляется имя метода (функции), а не свойства, то после его имени автоматически ставится круглая скобка. Например:
$a.sub <tab> $a.Substring(
Теперь можно вводить параметры метода (функции)…
Получение справки Windows PowerShell
Краткую справку по командлетам Windows PowerShell можно получить введя «-?» сразу после имени командлета, более подробную информацию о командлете можно получить при помощи команд help или get-help с ключами -detailed или -full. При использовании ключа -detailed некоторые технические детали опускаются.
help -full ConvertTo-Html ИМЯ ConvertTo-Html ОПИСАНИЕ Преобразует объекты Microsoft .NET Framework в код HTML, который может отображаться в веб-браузере. СИНТАКСИС ConvertTo-Html [[-Head] <string[]>] [[-Title] <string>] [[-Body] <string[]>] [-CssUri <Uri>] [[-Property] <Object[]>] [-As <string>] [-InputObject <psobject>] [-PostContent <string[]>] [-PreContent <string[]>] [<CommonParameters>] ConvertTo-Html [-Fragment] [[-Property] <Object[]>] [-As <string>] [-InputObject <psobject>] [-PostContent <string[]>] [-PreContent <string[]>] [<CommonParameters>] ОПИСАНИЕ Командлет ConvertTo-Html преобразует объекты . NET Framework в код HTML, который может отображаться в веб-браузере. Этот командлет можно использовать для вывода результатов выполнения команды на веб-страницу. Параметры командлета ConvertTo-Html позволяют выбирать свойства объектов, задавать формат таблиц или списков, определять заголовок HTML-страницы, добавлять текст перед объектом и после него, а также возвращать только фрагмент с таблицей или списком, а не полную страницу. При передаче командлету ConvertTo-Html нескольких объектов Windows PowerShell создает таблицу (или список) на основании свойств первого переданного объекта. Если у оставшихся объектов нет одного из указанных свойств, то значению этого свойства для такого объекта будет соответствовать пустая ячейка. Если же у оставшихся объектов имеются дополнительные свойства, значения этих свойств будут проигнорированы. ПАРАМЕТРЫ ............................ -Body Задает текст для добавления после открывающего тега . По умолчани ю в этом месте нет текста. Требуется? false Позиция? 4 Значение по умолчанию Нет текста. Принимать входные данные конвейера?false Принимать подстановочные знаки?false
Как видим некоторые параметры командлетов например как «-Body» требуют ввода атрибутов (значений), в полной справке с ключом «-full» даётся пояснение про их использование:
- Требуется? — Указывает, будет ли командлет выполнятся при отсутствии этого параметра. Если значение True, значит параметр обязателен. Если он не указан, система запросит его значение
- Позиция? — Показывает, используется ли параметр как именованный или позиционный (под номером). Позиционные параметры должны появляться в указанном месте команды. Если 0 или named, это значит, что при задании значения параметра необходимо указывать его имя. Если атрибут Позиция? имеет целое ненулевое значение, то имя параметра можно не указывать, в этом случае это так званый позиционный параметр. Например, «2» означает, что при отсутствии имени параметра этот параметр должен быть вторым. Если используется имя параметра, параметр может располагаться в любом месте команды.
- Значение по умолчанию — Содержит значение по умолчанию, в случае когда значение не определено явно. Часто обязательным параметрам, так же как и многим необязательным, никогда не присваивается значение по умолчанию. Например, многие команды, чьим входным значением является параметр -path, при отсутствии значения используют текущее местоположение.
- Принимать входные данные конвейера? — Показывает, можно ли (да) или нельзя (нет) посылать объекты в этот параметр по конвейеру. «По имени свойства» означает, что конвейеризованный объект должен иметь свойство с тем же именем, что и имя данного параметра.
- Принимать подстановочные знаки? — Показывает, может ли значение параметра включать подстановочные знаки, такие как «*» и «?».
Можно также получить справку не связанную с командлетами. Для просмотра всех доступных разделов справки используйте команду: help *
Список тем обсуждение которых представлено в справочной службе Windows PowerShell, можно увидеть с помощью команды: help about_*
Отметим, что Get-Help выводит содержимое раздела справки на экран сразу целиком. man и help позволяют выводить справочную информацию поэкранно, аналогично команде more интерпретатора cmd.exe.
История команд в сеансе работы Windows PowerShell
Все команды которые мы выполняем в оболочке Windows PowerShell, система записывает в специальный журнал сеанса или журнал команд, что даёт возможность повторно использовать эти команды или их комбинации, не набирая их повторно на клавиатуре.
По умолчанию Windows PowerShell сохраняет последние 64 команды. Для изменения числа сохраняемых команд нужно изменить значение специальной переменной $MaximumHistoryCount, например:
$MaximumHistoryCount 64 $MaximumHistoryCount=100 $MaximumHistoryCount 100
Просмотреть полный список выполнявшихся команд можно нажав клавишу F7 но, можно просматривать не весь список, а только те команды которые начинаются с определённых символов, для этого нужно ввести начальные символы и нажимать F8 для прокручивания списка команд начинающихся с этих символов.
Также есть возможность выполнить команду по её номеру в истории команд, для этого нужно нажать F9 и ввести порядковый номер в истории команд.
Кроме клавиатурных комбинаций для работы с журналом команд в Windows PowerShell имеются специальные командлеты, get-history (псевдонимы h, history и ghy) позволяет вывести историю команд, по умолчанию последние 32 команды. Число выводимых команд можно изменить с помощью параметра -Count.
Можно выделять из журнала сеанса команды, удовлетворяющие определённому критерию. Для этого используется конвейер и специальный командлет Where-Object. Например, для вывода команд, содержащих слово del, можно выполнить следующую команду:
Полученный с помощью Get-History список команд можно экспортировать во внешний файл в формате XML или CVS (текстовый файл с запятыми в качестве разделителя). Например:
Get-History | Export-CSV .\pshistory.csv
С помощью командлета Add-History можно добавлять команды обратно в журнал сеанса:
Import-CSV .\pshistory.csv | Add-History
Командлет Invoke-History (псевдонимы r, сокращение от «repeat» или «return», и ihy) позволяет повторно выполнять команды из журнала сеанса, при этом команды можно задавать по их порядковому номеру или первым символом, а также получать по конвейеру от командлета Get-History. Например:
# вызов последней команды Invoke-History # вызов седьмой команды Invoke-History -id 7 # или проще r 3 # вызов последней команды Get-Help Invoke-History Get-He # Вызов последней команды полученой по конвейеру от Get-History Get-History | Where-Object ($_.CommandLine -like "*del*") | Invoke-History
Протоколирование действий в сеансе работы Windows PowerShell
В оболочке Windows PowerShell можно вести запись в текстовый файл всего сеанса работы включая результат выполнения команд. Для этой цели служит командлет Start-Transcript
, имеющий синтаксис:
Start-Transcript [[-Path] <string>] [-Append] [-Force] [-NoClobber] [-Confirm] [-WhatIf] [<CommonParameters>] # Запустим протоколирование Start-Transcript -path .\psprotocol.txt # выполним что-то ps # остановим протоколирование Stop-Transcript # просмотрим результат type .\psprotocol.txt
Если имя файла протокола не указанно, то он будет сохранятся в файле, путь к которому задан в значении глобальной переменной $Transcript
Если переменная не определена, то командлет Start-Transcript сохраняет протоколы в каталоге «$HOME\Мои документы
» в файлах «PowerShell_transcript..txt
«.
Если файл протокола, в который должен начать сохранятся сеанс работы, уже существует, то по умолчанию он будет переписан. Параметр командлета Start-Transcript -append включает режим добавления нового протокола к существующему. Если же указан параметр -noclobber, а файл уже существует, то командлет Start-Transcript не выполняет никаких действий.
Настройка профилей Windows PowerShell
Все настройки произведённые в течении текущей сессии будут действовать только во время текущего сеанса работы и будут утеряны после выхода их оболочки PowerShell. Для сохранения изменений необходимо создать профиль пользователя PowerShell и записать в него все команды, которые будут определять все нужные нам псевдонимы, функции, переменные и т. п.. Профиль пользователя PowerShell — это сценарий, который будет загружаться при каждом запуске Windows PowerShell.
Грамотно созданный профиль может существенно облегчить работу в Windows PowerShell и администрирование операционной системы в целом. Создание и распространение профилей может помочь поддерживать единородное и согласованное представление оболочки Windows PowerShell не нескольких компьютерах.
Windows PowerShell поддерживает профили четырех типов. Дело в том, что модель Windows PowerShell предусматривает возможность использования разных интерфейсов для языка (так называемых интерфейсов), а powershell.exe представляет собой лишь один из таких хостов.
* ПРИМЕЧАНИЕ:
В настоящее время доступны несколько альтернативных хостов Windows PowerShell, например PowerShell и PowerShell, которые можно загрузить с сайта http://powershell.com/
Name Описание ----------- ----------- $Profile Текущий пользователь, текущее ведущее приложение $Profile.CurrentUserCurrentHost Текущий пользователь, текущее ведущее приложение $Profile.CurrentUserAllHosts Текущий пользователь, все ведущие приложения $Profile.AllUsersCurrentHost Все пользователи, текущее ведущее приложение $Profile. AllUsersAllHosts Все пользователи, все ведущие приложения
Проверить создан ли тот или иной профиль можно командой:
Test-Path $Profile False
Если профиль существует, то команда выдастTrue, в противном случае —False. Для создания или изменения существующего профиля нужно открыть в текстовом редакторе файл, путь к которому хранится в одной из указанных выше переменных. Сделать это можно прямо из оболочки Windows PowerShell:
notepad $profile
Если профиль Windows PowerShell уже существует, то будет открыт Блокнот Windows с содержимым файла Microsoft.PowerShell_profile.ps1, иначе будет открыто диалоговое окно с сообщением о том, что открываемый файл не найден. Нажав кнопкуOKв этом окне мы попадаем в пустое окно Блокнота Windows — теперь нужно ввести команды, которые мы планируем выполнять при каждой загрузке Windows PowerShell, в нашем случае это:
Далее следует сохранить файл в каталоге \Мои документы\WindowsPowerShell\, если каталог \Мои документы\WindowsPowerShell\ отсутствует, то его нужно будет предварительно создать, перейти в этот каталог и там сохранить этот файл с именем Microsoft. PowerShell_profile.ps1
Теперь выйдем из Windows PowerShell и снова откроем его, если выдается ошибка, то это говорит о том, что установленная по умолчанию политика «Restricted» запрещает выполнение PowerShell скриптов. Для разрешения выполнения скриптов следует выполнить команду:Set-ExecutionPolicy RemoteSigned
Снова выйдем и запустим Windows PowerShell и теперь мы должны увидеть, что полный путь, в котором открыта оболочка Windows PowerShell, отображается в верхней панели окна, а приглашение командной строки имеет вид «PS >». Таким образом область ввода команд не забивается текущим путём в котором запущена оболочка и свободна для ввода команд, а текущий путь мы всегда сможем созерцать в верхней части окна.
Windows PowerShell как калькулятор
В командной строке PowerShell можно вычислять выражения, то есть пользоваться командной строкой как калькулятором (в оболочке cmd.exe эта возможность отсутствовала).
PS C:\> 2+9 11
Результат сразу появляется на экране и нет нужды использовать для вычислений дополнительные команды. В командной строке можно также вычислять значения с плавающей точкой:
PS C:\> 20/3 6,66666666666667
PowerShell способен выполнять и более сложные математические вычисления. Например вычисление квадратного корня из числа 327:
PS I:\> [System.Math]::Sqrt(327) 18,0831413200251
В этом примере используется метод Sqrt() класса System.Math Результаты вычислений можно сохранять в переменную и пользоваться ими в рамках текущей сессии:
$a=30/2 $a 15 $a*10 15050
Запуск .bat в PowerShell
Для запуска .bat файлов в PowerShell необходимо переместится в каталог с нужным .bat или .cmd файлом при помощи команды cd c:\script и там набрать его имя вместе с расширением PS > ./flush.bat или без него PS > ./flush при этом уточнить в консоли PowerShell место запуска . / .bat или .cmd файла или же указать в консоли PowerShell полный путь к .cmd или .bat файлу.
P.S. Если на этой странице вы не нашли ответа на свой вопрос задайте его в комментариях незабыв при этом подписаться на получение ответа на него!
Автор: Олег Головский
windows — Как запустить несколько команд одну за другой в cmd
спросил
Изменено
2 года, 8 месяцев назад
Просмотрено
415 тысяч раз
Как запустить несколько команд cmd.exe ОС Windows одну за другой,
Я использую ncrack
, команды
Я вручную открываю cmd.exe и вставляю этот код:
ncrack --user Admin -P pass1.txt:3389 -on good.txt -f
Когда файл pass1.txt завершен, я вручную вставляю в cmd. exe вторую команду,
который содержит Pass2.txt и т.д…:
ncrack --user Admin -P pass2.txt:3389 -on good.txt -f
, затем я вставляю вручную в cmd, Pass.3txt
ncrack --user Admin -P pass3.txt:3389 -on good.txt -f
Как я могу автоматически запускать все команды в пакетном файле, одну за другой
другой и не все одновременно?
- windows
- cmd.exe
5
Попробуйте использовать условное выполнение и
или &&
между каждой командой либо с копированием и вставкой в окно cmd.exe, либо в пакетный файл.
Дополнительно можно использовать двойную трубу ||
символов, чтобы запускать следующую команду только в случае сбоя предыдущей команды.
Выполнить команду2 после завершения выполнения команды1
ncrack --user Admin -P pass1.txt:3389 -on good.txt -f & ncrack --user Admin -P pass2. txt :3389 -on good.txt -f & ncrack --user Admin -P pass3.txt :3389 -on good.txt -f
Выполнять команду 2, только если выполнение команды 1 завершилось успешно IP-адрес>: 3389-on good.txt -f && ncrack —user Admin -P pass3.txt
Выполнять команду2, только если выполнение команды1 завершилось неудачно
ncrack --user Admin -P pass1.txt:3389 -on good.txt -f || ncrack --user Admin -P pass2.txt :3389 -on good.txt -f || ncrack --user Admin -P pass3.txt :3389 -ON good.txt -f
Вспомогательные ресурсы
- Условное выполнение
[1]
- Условное выполнение
[2]
0
Используйте приведенный ниже синтаксис в вашем файле cmd.
команда вызова1 команда вызова2 . . вызвать командуx
Пример:
call mvn install:install-file -Dfile=spring. jar -DgroupId=com.td.tdi.creditProtection.webservice -DartifactId=spring -Dversion=1.0 -Dpackaging=jar call mvn install:install-file -Dfile=com.ibm.ws.prereq.jaxrs.jar -DgroupId=com.td.tdi.creditProtection.webservice -DartifactId=com.ibm.ws.prereq.jaxrs -Dversion=1.0 - Dpackaging=баночка call mvn install:install-file -Dfile=com.ibm.ws.runtime.jar -DgroupId=com.td.tdi.creditProtection.webservice -DartifactId=com.ibm.ws.runtime -Dversion=1.0 -Dpackaging=jar call mvn install:install-file -Dfile=IMSConnection_Utilities.jar -DgroupId=com.td.tdi.creditProtection.webservice -DartifactId=IMSConnection_Utilities -Dversion=1.0 -Dpackaging=jar
2
Вы можете ввести обе команды в одну строку и разделить их либо одним амперсандом (который заставит их выполняться последовательно), либо двумя амперсандами (что вводит простую проверку ошибок: вторая команда запускается только в том случае, если первая была успешной )
например:
ncrack --user Admin -P pass1. txt:3389 -on good.txt -f && ncrack --user Admin -P pass2.txt :3389-oN хорошо.txt -f
Источник
3
Просто добавьте все команды построчно в пакетный файл и сохраните файл как somename.bat.
Выполнить пакетный файл; все команды будут выполняться последовательно в порядке их присутствия в файле.
Как выполнить пакетный файл через cmd:
путь/к/каталогу/из/вашего/пакетного файла/какое-то имя.bat
3
Все, что я сделал, это вставил команды.
Например, чтобы улучшить мое интернет-соединение, я вставил:
ipconfig /flushdns ipconfig /registerdns ipconfig/выпуск ipconfig/обновить netsh int ip сброс netsh сброс винсока
Щелкните правой кнопкой мыши, и будь то cmd или powershell, он автоматически выполнит их все последовательно.
Вам даже не нужно нажимать «ввод». Простой! (последний, то есть «netsh winsock reset», был единственным, для которого мне пришлось нажать Enter, поскольку он не запускался автоматически)
Последовательный запуск команд Powershell в их собственных окнах и предотвращение выхода из них
спросил
Изменено
4 года, 11 месяцев назад
Просмотрено
3к раз
Я хочу последовательно запускать несколько команд Powershell в своих собственных окнах Powershell и не хочу, чтобы эти окна закрывались после запуска.
Пример:
Powershell Start-Process {Write-Host "hello"}; Пуск-Процесс powershell {Write-Host "привет"}; Powershell Start-Process {Write-Host "привет"}
Окна Powershell закрываются сразу после запуска. Я хочу, чтобы они оставались открытыми.
Редактировать: Несколько команд не всегда одинаковы, и их количество может различаться.
- пауэршелл
1
# Асинхронно запускает 3 новых окна PowerShell, которые # вывести "hello #" на консоль и оставаться открытым. 1..3 | ForEach-Object { Powershell Start-Process -Args '-noexit', '-command', "Write-Host 'hello #$_'" }
-noexit
требуется, чтобы сеанс PowerShell оставался открытым после выполнения команды с-command
(запуститеpowershell.exe -?
, чтобы увидеть все параметры CLI)Обратите внимание, как аргументы указываются индивидуально , как
,
-разделенные элементы массива , который передается в
-Args
(сокращение от-ArgumentList
, хотя имя параметра может вообще исключить в Это дело).Обратите внимание, что команда
Write-Host
передается в виде строки — блоки скриптов как таковые в этом сценарии не поддерживаются; вы можете передать один, как вы пытались, но он будет незаметно преобразован в строку , что просто означает, что используется ее литеральное содержимое (все между{
и}
).
Другими словами: передача{Write-Host "hello"}
аналогична'Write-Host "hello"'
, но во избежание путаницы вы должны передать строка .Вы можете передать блок скрипта как таковой, только если вы вызываете
powershell.exe
напрямую , а не черезStart-Process
; однако вам нужноStart-Process
, чтобы запустить новый сеанс в новом окне и запустить его асинхронно .Кроме того, строка была изменена на строку в двойных кавычках (
". .."
) со встроенным в одинарных кавычках ('...'
), чтобы убедиться, что ссылка на$_
— автоматическую переменную, представляющую имеющийся объект конвейера (1
,2
или3
) — является расширенным (интерполированным).
Использование конвейера ( |
) с массивом входных данных ( 1..3
, который возвращает массив 1, 2, 3
) с командлетом ForEach-Object
— это просто пример — вы по-прежнему можете вызывать отдельные команды по отдельности, одну за другой , в отдельных строках или разделенных ;
— благодаря Start-Process
они все равно будут запускаться асинхронно.
Однако, если отдельные команды имеют общую логику , конвейерный подход может упростить дело; вы можете поместить общую логику в тело вызова ForEach-Object
и передать переменные части в качестве входных данных через конвейер.
2
Поместите read-host в конец последовательности команд — он будет ждать, пока вы что-нибудь введете, прежде чем продолжить выполнение (и, предположительно, выйти?). Чтобы скопировать/вставить пример по этой ссылке, вы можете что-то вроде этого, что приостановит выполнение, пока вы что-нибудь не введете: $Age = Read-Host «Пожалуйста, введите свой возраст»
-> Ref: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/read-host?view=powershell- 6
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.