Powershell bat: Как писать и как запускать скрипты PowerShell
Содержание
Запуск скрипта PowerShell
PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
Как запустить скрипт PowerShell?
Есть несколько различных способов запуска скрипта, ниже приведены основные:
- Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:\Scripts\test.ps1, или перейти в папку скрипта командой cd C:\Scripts и запустить его командой .\test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
- Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
- Запустить стандартную коммандную строку и в ней написать:
powershell -file <имя_скрипта> (пример: powershell -file myscript.ps1)
Если вы раньше не запускали скрипты PowerShell, то скорее всего, вы получите сообщение: Не удается загрузить файл <имя_скрипта>, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений. Связано это с тем, что из соображений безопасности и недопущения случайного выполнения вредоносного кода, все скрипты должны быть подписаны цифровой подписью.
Как разрешить выполнение неподписанного скрипта PowerShell?
1. В оболочке PowerShell, перед тем как запускать скрипт, выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:
Set-ExecutionPolicy RemoteSigned -Scope Process
2. При запуске из стандартной коммандной строки использовать параметр -executionpolicy, т.е. запускать скрипт так:
powershell -executionpolicy RemoteSigned -file <имя_скрипта>
Оба способа устанавливают политику только для текущего сеанса, при этом, политика безопасности выполнения скриптов PowerShell, прописанная в реестре, не будет изменена и останется прежней. Если вы хотите поменять политику безопасности выполнения скриптов «на постоянно», то используйте такой способ:
3. Разрешить запуск навсегда: запустить оболочку PowerShell от имени «Администратора», затем выполните команду:
Set-ExecutionPolicy RemoteSigned
Однако, я бы не рекомендовал такой способ, чтобы не подвергать ваш компьютер возможным угрозам, т. к. так вы разрешаете выполнение скриптов всем и всегда.
Примечание: Если скрипт был загружен из интернета, то чтобы избежать запроса на подтверждение запуска, нужно вместо RemoteSigned использовать Bypass — полное отключение любых запросов и предупреждений.
Как запустить скрипт PowerShell в фоновом режиме?
Для этого достаточно использовать параметр запуска -WindowStyle, который может принимать значения: Normal, Minimized, Maximized и Hidden. Таким образом, чтобы запустить неподписанный скрипт в фоновом режиме, нужно выполнить команду:
powershell -executionpolicy RemoteSigned -WindowStyle Hidden -file <имя_скрипта>
Так же можно еще при желании добавить -NonInteractive, чтобы скрипт не задавал никаких вопросов. Таким образом, скрипт выполнится незаметно для пользователя. Будmте внимательны, используя такой способ.
Запуск скрипта PowerShell c параметрами
Собственно запуск нужно делать как если бы вы запускали обычную программу или bat-файл с параметрами. Например, для запуска скрипта с параметрами из командной, можно написать такую команду:
powershell -executionpolicy RemoteSigned -file <имя_скрипта> param1 param2 «еще один текстовый параметр»
В самом скрипте вы можете получить эти параметры так:
param ($var1, $var2, $var3) echo $var1, $var2, $var3
В интегрированной среде PowerShell ISE запустить скрипт с параметрами можно аналогично, используя область команд.
Как запустить скрипт PowerShell с помощью ярлыка?
Осуществить такую задачу можно двумя способами:
- Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
- Создать ярлык на PowerShell, который можно найти в папке c:\Windows\System32\WindowsPowerShell\v<версия>\ и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.
Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.
Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом 😉
Как запустить команду powershell в пакетном файле
спросил
Изменено
1 месяц назад
Просмотрено
45 тысяч раз
@ЭХО выкл. $BIOS= Get-WmiObject -имя_компьютера "BAHRIATSG2-PC" -пространство имен root/hp/instrumentedBIOS -Class HP_BIOSSettingInterface $BIOS.SetBIOSSetting('Пароль для установки','ПарольBIOS',' ') Пауза
, когда я сохраняю файл .
$BIOS.SetBIOSSetting(‘Пароль для установки’,’
Пауза
9 в конце каждой строки, кроме последней строки, и экранируйте каждую кавычку обратной косой чертой.
0
После этой темы:
https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/converting-powershell-to-batch
вы можете легко преобразовать любой сценарий PowerShell в пакетный файл, используя эту функцию PowerShell:
функция Convert-PowerShellToBatch { параметр ( [Параметр (обязательный, ValueFromPipeline, ValueFromPipelineByPropertyName)] [нить] [Псевдоним ("Полное имя")] $Путь ) процесс { $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content -Path $Path -Raw -Encoding UTF8))) $newPath = [Io.Path]::ChangeExtension($Path, ".bat") "@echo off`npowershell. exe -NoExit -encodedCommand $encoded" | Set-Content -Path $newPath -Кодировка Ascii } }
Чтобы преобразовать все сценарии PowerShell внутри каталога, просто выполните следующую команду:
Get-ChildItem -Path-Filter *.ps1 | Convert — PowerShellToBatch
Где находится путь к нужной папке. Например:
Get-ChildItem -Path "C:\path\to\powershell\scripts" -Filter *.ps1 | Convert — PowerShellToBatch
Чтобы преобразовать один скрипт PowerShell , просто запустите это:
Get-ChildItem -Path| Convert — PowerShellToBatch
Где находится путь к нужному файлу.
Преобразованные файлы находятся в исходном каталоге. то есть
powershell имеет собственный тип файла сценария с расширением .ps1
Сохраните свой код в файле .ps1 и запустите его из пакетного файла с помощью:
powershell xxx. ps1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Вызов сценария Powershell из пакетного сценария.
. Но нужен пакетный сценарий для ожидания завершения сценария Powershell
У меня есть пакетный сценарий со следующим кодом:
Вот пакетный сценарий (Test.bat ):
call powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1 выход / б
В сценарий Powershell (TheScriptToBeExecuted.ps1) встроено некоторое время ожидания. Но когда этот файл вызывается, пакетный скрипт НЕ ждет завершения скрипта Powershell.
Я когда-либо пробовал:
START /wait powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1
Безрезультатно.
Когда я дважды щелкаю файл Test.bat, кажется, что он ждет. Я проверил много ответов, но не смог найти ни одного, соответствующего этой проблеме.
Пожалуйста, помогите.
- powershell
- пакетный файл
13
powershell -ExecutionPolicy ByPass -command ". 'C:\path\TheScriptToBeExecuted. ps1'
Это должно сделать это, если нет, то мы добавим < NUL
в конец
powershell -ExecutionPolicy ByPass -command ". 'C:\path\TheScriptToBeExecuted.ps1' < NUL
Используя точечный поиск, мы открываем powershell в окне cmd со ссылкой powershell
в приведенном выше решении. Затем период позволяет скрипту запускаться и в окне cmd. Я сделал двойной тест и сделал .ps1 с start-sleep -s 3
в нем, и вышеприведенное действительно ждало завершения сценария powershell.
метод 2
Использование Start/wait
START/wait PowerShell.exe "& "'C:\path\TheScriptToBeExecuted.ps1'
Этот метод не будет работать в окне cmd. Он открывает терминал powershell и запускается там, а затем возвращается к летучей мыши.
1
start /wait powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1 | ЭХО > ноль
Попробуйте вышеописанное. Удерживает команду до тех пор, пока не будут выполнены сценарии без пакетной подсказки Teminate. Используйте start /min /wait, если не нужно отображать или взаимодействовать со сценарием, или альтернативно:
start /wait powershell.exe -executionpolicy remotesigned -WindowStyle Hidden -File TheScriptToBeExecuted.ps1 | ЭХО > ноль -WindowStyle Значение Устанавливает стиль окна для сеанса. Допустимые значения: «Обычный», «Свернутый», «Развернутый» и «Скрытый».
* | * передает вывод команды, однако, поскольку вы только что запускаете powershell.exe и не используете его в контексте использования команды, подобной следующей, это не должно быть проблемой.
powershell -command "((Get-date).AddDays(0)).ToString(':dd:MM:yyyy') | set-content 'captureVar.txt'" && set /p Yesterday=Сценарий, который я тестировал, работал, но не полностью.
дайте мне знать, как это происходит.3
Я думаю, что проблема скорее в "TheScriptToBeExecuted.