Powershell bat: Как писать и как запускать скрипты PowerShell

Запуск скрипта PowerShell

PowerShell — это новая командная оболочка для Windows, которая по задумкам Microsoft должна вытеснить и заменить cmd. По-умолчанию, эта оболочка уже идет в составе Windows 7 и выше. Если у вас более старая операционная система или вы просто хотите скачать более свежую версию PowerShell, сделать это можно здесь: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx

Как запустить скрипт PowerShell?

Есть несколько различных способов запуска скрипта, ниже приведены основные:

  1. Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:\Scripts\test.ps1, или перейти в папку скрипта командой cd C:\Scripts и запустить его командой .\test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
  2. Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
  3. Запустить стандартную коммандную строку и в ней написать:
    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 с помощью ярлыка?

Осуществить такую задачу можно двумя способами:

  1. Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
  2. Создать ярлык на 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(‘Пароль для установки’,’ПарольBIOS’,’‘)
Пауза
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.