2013-10-12 6 views
104

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

$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 

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

Enter image description here

ответ

145

Вам понадобится -ExecutionPolicy параметр:

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

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

+1

@joey это сработало спасибо .. но после запуска файла bat я получил эту ошибку «Waring: column« command »не вписывается в дисплей и удаляется» – Eka

+0

Это предупреждение, а не ошибка. И еще вопрос по другому вопросу. – Joey

+0

@joey мудро ли писать другой вопрос в stack.SE для этого незначительного предупреждения? – Eka

69

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

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

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 в том же каталоге, как описано в моем сообщении в блоге.

+1

Yay admin работает! – PsychoData

+0

Invoke-WebRequest отлично работает при вводе командной строки в cmd-окне, но возвращает 404 всякий раз, когда я запускаю его из пакетного файла. Я пытаюсь «PowerShell -NoProfile -ExecutionPolicy Bypass -Command» & {Start-Process PowerShell -ArgumentList -NoProfile -ExecutionPolicy Обход 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'. Есть идеи? – Chris

+0

Попробуйте использовать -ExecutionPolicy Unrestricted. Я предполагаю, что опция Bypass не дает доступ к сети PowerShell. – deadlydog

7

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

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

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

0

Если вы хотите запустить несколько скриптов, вы можете использовать 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 
7

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

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'" 
0

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

Смежные вопросы