Как запустить скрипт PowerShell из командного файла

197

Я пытаюсь запустить этот скрипт в PowerShell. Я сохранил приведенный ниже скрипт как ps.ps1на рабочем столе.

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

Я сделал пакетный скрипт для запуска этого скрипта PowerShell

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

Но я получаю эту ошибку:

Введите описание изображения здесь

Eka
источник

Ответы:

267

Вам нужен -ExecutionPolicyпараметр:

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

В противном случае PowerShell рассматривает аргументы линию для выполнения и в то время как Set-ExecutionPolicy это командлет, он не имеет -Fileпараметра.

детеныш
источник
2
@joey, это сработало, спасибо..но после запуска файла bat я получил эту ошибку "Waring: column 'command' не вписывается в дисплей и был удален"
Eka
Это предупреждение, а не ошибка. И еще тема для другого вопроса.
Джои
@ Joey Разумно ли написать еще один вопрос в стеке. SE для этого незначительного предупреждения?
Ека
2
@Joey Ха-ха, настолько эффективно, что вы можете переопределить эту политику, не будучи администратором. Это проблема безопасности?
Каньон Колоб
2
@KolobCanyon: Если вы в состоянии запустить PowerShell, вы также можете делать почти все остальное. Обратите внимание, что политика выполнения не означает, что PowerShell имеет больше привилегий, чем в противном случае. В некотором смысле это просто удобство, чтобы избежать случайного запуска вещей, которые вы, возможно, не захотите запускать. Подобно тому, как префикс команд в текущем каталоге ./и с исполняемым флагом в Unix.
Джои
117

Я объясняю, почему вы хотите вызывать скрипт PowerShell из командного файла, и как это сделать в моем блоге здесь .

Это в основном то, что вы ищете:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

И если вам нужно запустить скрипт PowerShell от имени администратора, используйте это:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

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

deadlydog
источник
Invoke-WebRequest работает нормально, когда я набираю командную строку в окне cmd, но возвращает 404 всякий раз, когда я запускаю его из командного файла. Я пытаюсь PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C:\_my\script.ics' -Verb RunAs}";или powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics", или с помощью параметра -File для того же в файле .ps1, или (New-Object Net.WebClient).DownloadFile. Любые идеи?
Крис
Попробуйте использовать -ExecutionPolicy Unrestricted. Я предполагаю, что опция Bypass не дает доступ к сети PowerShell.
deadlydog
1
@Belun Ссылка в блоге показывает, как передать параметры в сценарий.
deadlydog
19

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

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
e.gad
источник
16

Если вы запускаете командный файл с именем PowerShell от имени администратора, вам лучше запустить его следующим образом, избавив вас от всех проблем:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

Лучше использовать Bypass...

Корневая петля
источник
3

Если вы хотите запустить несколько скриптов, вы можете использовать Set-executionpolicy -ExecutionPolicy Unrestrictedи затем выполнить сброс с помощью Set-executionpolicy -ExecutionPolicy Default.

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

# Check current setting
Get-ExecutionPolicy

# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es

Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com  | tee ping__google.com.txt  }

# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es
Nux
источник
2

Другой простой способ выполнить скрипт ps из пакета - это просто включить его между ECHO и символами перенаправления (> и >>), например:

@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"

Последняя строка удаляет созданный временный файл.

Dobbelina
источник
1

Если ваш сценарий входа в PowerShell запускается через 5 минут (как у меня) на сервере 2012 года, на сервере есть параметр GPO - «Настройка сценария входа с задержкой», параметр по умолчанию «не настроен», это оставит 5-минутную задержку перед запуском сценария входа.

Нил 11111
источник
1

Небольшой образец test.cmd

<# :
  @echo off
    powershell /nologo /noprofile /command ^
         "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...
DimoN
источник