Как запустить скрипт PowerShell при запуске компьютера?
У меня есть сценарий PowerShell, который отслеживает папку с изображениями. Мне нужно найти способ автоматического запуска этого скрипта после запуска компьютера.
Я уже попробовал следующие методы, но не смог заставить его работать.
Используйте msconfig и добавьте сценарий PowerShell при запуске, но я не могу найти сценарий PowerShell в этом списке.
Создайте ярлык и поместите его в папку автозагрузки. Не повезло.
или % SystemRoot% system32 WindowsPowerShell v1.0 powershell.exe -File «C: Doc Files FileMonitor.ps1»
Вот мой сценарий PowerShell:
Я также попытался добавить основную задачу с помощью taskschd.msc. Это все еще не работает.
Вот что я нашел, и, возможно, это поможет отладить его.
Если я открываю окно PowerShell и запускаю там скрипт, он работает. Но если я запускаю его в командной строке CMD,
Это не сработает. Я не уверен, что это проблема с разрешением или что-то еще.
Кстати, у меня установлен PowerShell 3.0, и если я наберу $ host.version, там будет показано 3. Но мой powershell.exe, похоже, все еще v1.0.
Выключение и перезапуск
Итак, самая простая операция выключения вашего компьютера. Открываем блокнот, прописываем:
Сохраняем файл, как *.cmd (*- имя вашего файла, например shutdown.cmd) и не забудьте в типе выбрать “все файлы”. Всё, исполняемый файл по запуску выключит ваш компьютер. “-s”, в данном случае означает выключение, замените на “-r” — получите перезагрузку. “-t” — таймер, у нас он установлен на 0 секунд, но если установить на 60 — получите выключение через 60 секунд.
Завершение сеанса пользователя
Чтобы завершить текущую сессию пользователя (logout), нужно выполнить команду:
Эта команда аналогично выполнению команды logoff.
Скрипт PowerShell для перезагрузки по расписанию
Предположим, что вам нужно перезагрузить компьютер по расписанию, это можно сделать и групповыми политиками, а так же и через задачу по расписанию, актуально для компьютеров не в домене. Вы в задаче подкладывает ваш скрипт PowerShell, чтобы выполнять его в нужное время, но с уведомлением человека. Ниже текст скрипта.
$wshell.Popup(«Данный компьютер будет перезагружен»,10,»Сохраните свои данные»,0x0)
$wshell.Popup(«Перезагрузка будет через 30 секунд»,2,»Не забудьте сохранить данные»,0x0)
Restart-Computer -ComputerName w10-cl01
Еще бонусом перезагрузка локального компьютера может быть выполнена и с помощью WMI. Для этого в оболочке PowerShell введите;
На этом у меня у меня все. Мы разобрали удаленную перезагрузка компьютера через PowerShell, разобрали работу со списками. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Создаем отчет об использовании дисков
Администраторы должны отслеживать свободное место, оставшееся на серверах. Это можно сделать, использовав WMI и класс Win32_LogicalDisk, которые дают нам информацию такую как ID устройства, размер диска, свободное места и прочую информацию.
Через WMI мы можем обращаться к локальным и удаленным компьютерам. Мы также можем выполнять эти запросы как одной, так и нескольких машинах. Также мы можем: экспортировать данные в .csv или базу данных, создавать текстовый или HTML-отчет или просто вывести результаты на экран.
Пример команды, выполняемой на локальном компьютере.
Мы используем командлет GetWmiObject для возвращения информации из класса Win32_LogicalDisk. Затем мы применяем -filter чтобы возвратить только информацию, для которой справедливо утверждение drivetype=3, которое означает фиксированные логические диски, типа C:. Это значит, что информация относительно о USB и сетевых дисках не будет включена. Полученная информация будет записана в файл Disks.txt.
Пример в PS.
Хотя вроде бы все нормально, лучше внести парочку улучшений. Например, добавить отображение свободного места в гигабайтах, а не байтах. Этим мы и займемся.
Чтобы это сделать создадим функцию Get-DiskUtil. Хотя в предыдущем примере мы все делали интерактивно, в этом случае давайте запишем функцию в файл, загрузим в ваш профиль к другим скриптам, которые можно использовать позже.
А вот и сама функция:
Давайте ее разберем.
Функция берет имя компьютера как параметр и задает его как имя локального компьютера по умолчанию.
Затем мы используем фрагмент скрипта Process, где свойство “имя компьютера” передается в функцию. “
[H1toH2]
” указывает, что имя компьютера задается как переменная. В противном случае имя компьютера как будет воспринято как параметр.
Далее следует выражение GetWmiObject.
Вывод этого выражения передается в командлет Select-Object (сокращенно Select). Мы используем хеш-таблицы, чтобы создать пользовательское свойство под названием Computername. Фактически будет осуществлено переименование SystemName текущего объекта (
) в Computername. DeviceID остается неизменным.
Сделаем еще парочку хеш-таблиц. Первая берет свойство Size и делит его на 1GB, вывод будет с двумя знаками после запятой и переименовывает свойство в SizeGB. Вторая производит то же самое со свойством Freespace.
Затем создаем свойство UsedGB, которого нет в WMI. Вычисляется разница между свойствами Size и FreeSpace и делится на 1GB.
В конце создаем еще одно свойство PerFree – свободно в процентах. Оно завершает функцию.
Ниже приведена работа функции для компьютера CHI-FP01, выведенная в таблице (Format-Table (или ft)) с авто форматированием (параметр –auto).
Все и так хорошо, но от этой функции мы можем получить больше. Поэтому предположим, что вам нужно еженедельно получать отчет об использовании дисков на всех серверах в вашей компании. Посмотрим, как этого можно достичь.
Для начала сохраним результаты нашего выражения в переменную $data, чтобы каждый раз не набирать эту команду. Затем, передадим результаты в объект where, пропингуем сервера (дважды) и передадим имя компьютера в созданную нами функцию Get-DiskUtil.
Данные будут храниться в переменной $data. Вы можете вытащить информацию из $data и отсортировать по computername, применив –auto. Информация также может быть направлена на печать (Out-Printer) или в файл (Out-File).
Конвертируем в csv:
Потом Вы можете импортировать этот csv файл для получения снимка статуса использования дисков на момент запуска команды:
И напоследок: я покажу, как создать HTML отчет, доступ к которому можно получить из любого места.
Берем $data и передаем ее в Sort Computername. Результат передается в командлет ConvertTo-HTML. Вы можете присвоить заголовок и путь CSS. CSS необходим, так как ConverToHTML не обладает возможностями форматирования. Поэтому если вы хотите, чтобы отчет выглядит прилично, понадобится CSS файл. На последнем этапе пишем результат в файл.
Теперь файл готов, его можно посмотреть с помощью команды start.
Пример HTML отчета.
Помните, что информацию необходимо держать информацию актуальной.
Вторую часть перевода смотрите здесь.
P.S. Не могли не обратить внимание, что та же задача получения информации о свободном месте на дисках может решаться с помощью нашей бесплатной программы NetWrix Disk Space Monitor.
Посмотреть как программа работает можно на youtube, cкачать здесь , а активировать бесплатную лицензию без ограничения срока действия (и вообще без каких либо ограничений) можно используя следующие данные:
License name: NetWrix Disk Space Monitor Freeware License
License count: 1000000
License code: EhEQEhoaEhEQEhYTEhYaExQa
[/H1toH2]
Ошибка «Невозможно инициировать завершение работы системы, так как компьютер используется другими пользователями»
При перезагрузки удалённого компьютера, например:
может возникнуть ошибка
Эта ошибка возникает если какой-либо пользователь выполнил вход на удалённом компьютере, для принудительной перезагрузки используйте опцию -Force:
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 можно получить справку по любому командлету.
При использовании командлета есть возможность указать несколько параметров при запуске. Первый параметр можно не называть. Выше я писал Get-Command *Process* где указал поиск командлетов со словом Process. Однако я не написал параметр -Name, хотя именно его и указал. Если полностью то поиск по имени выглядит так: Get-Command -Name *Process* . В случае отсутствия непосредственного указания -Name Powershell принимает в качестве имени введенное слово *Process*.
Давайте выведем список процессов с именем WhatsApp
Get-Process
Мы вывели все процессы с именем WhatsApp и добавили в вывод дополнительный параметр -IncludeUserName, что позволило нам увидеть кем запущен процесс.
Алиасы
Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process.
Список всех alias можно получить используя командлет Get-Alias
Как видно из списка для alias использованы аналогичные по значению команды из Linux: ls, man, mount, md, kill и т.п. Видимо чтобы линуксоиду было по привычнее Можно создать свой alias используя командлет New-Alias
Конвейер
Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. Ничего непонятно? Давайте на примерах, так всегда яснее.
Возьмем уже известный нам командлет Get-Process, посмотрим на его вывод
Get-Process
Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.
Get-Process|Sort-Object
Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл
Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.
Структура объектов
В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member
Get-Process|get-Member
Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process
Давайте посмотрим тип данных у новой переменной
Get-Member String
В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.
Get-Member methods
Как видно на картинке выше мы заключаем нашу тестовую переменную $new в скобки и после них пишем точку и указываем метод. В примере я использовал три метода:
- ToUpper — перевод всех букв в строке в верхний регистр
- ToLower — перевод всех букв в строке в нижний регистр
- Length — подсчитать количество символов в строке
Это всего лишь небольшой пример что можно сделать с параметрами объекта. Чаще используйте Get-Member и вы откроете для себя безграничные возможности манипуляции над объектами.
Скрипты Powershell
В самом начале статьи указал на встроенный инструмент Powershell ISE. Давайте запустим его и создадим свой первый скрипт. Кстати скрипты сохраняются в файлах с расширением ps1
Скрипт будет запускать блокнот, далее выполняется проверка если блокнот запущен выводится сообщение об этом и после блокнот закрывается. Если блокнот не запущен то выводится соответствующее сообщение об этом. На самом деле блокнот будет всегда запущен, т.к. мы вначале скрипта написали Start-Process notepad
Powershell скрипты
В этом скрипте я использовал цикл if else. О циклах будет подробнее в следующей статье. Итак давайте сохраним скрипт и выполним его.
В ответ мы получим такую ошибку:
Все верно, изначально в WIndows запрещено выполнять скрипты Powershell. Это сделано для повышения безопасности системы. Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров:
- Restricted — политика по умолчанию. Выполнение всех скриптов запрещено
- RemoteSigned — разрешено запускать собственные скрипты и подписанные доверенным разработчиком
- AllSigned — разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение
- Unrestricted — в системе разрешается запускать любые скрипты
Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted. Давайте так и сделаем
Set-ExecutionPolicy
Будет предупреждение по безопасности, соглашаемся нажав Y
Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy
Get-ExecutionPolicy
В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного
Запуск файла сценария PowerShell
Чтобы запустить файл сценария в PowerShell, необходимо изменить политику выполнения, выполнив следующие действия:
- Откройте поиск и введите PowerShell, щелкните правой кнопкой мыши в верхний результат и выберите Запуск от имени администратора.
- Введите следующую команду, чтобы разрешить выполнение скриптов и нажмите клавишу Enter :
Введите следующую команду для запуска скрипта и нажмите клавишу Enter : & «C:PATHtoSCRIPTfirst_script.ps1»
В приведенной выше команде обязательно измените PATHtoSCRIPT на расположение вашего скрипта.
После выполнения этих шагов сценарий будет запущен, и если он был создан правильно, вы должны увидеть его вывод без проблем.
PowerShell в Windows 10 включает четыре политики выполнения:
- Restricted – останавливает выполнение скрипта.
- RemoteSigned – запускает скрипты, созданные на устройстве. Однако, сценарии, созданные на другом компьютере, не будут запускаться, если они не содержат подписи доверенного издателя.
- AllSigned – все скрипты будут работать до тех пор, пока они подписаны надежным издателем.
- Unrestricted запускает любой скрипт без каких-либо ограничений.
В приведенных выше шагах мы использовали команду, чтобы разрешить запуск локальных скриптов в Windows 10. Однако, если вы не планируете регулярно выполнять скрипты, можно восстановить настройки по умолчанию, используя те же инструкции, но на Шаге 4, обязательно используйте Set-ExecutionPolicy Restricted команду.