Як запустити скрипт 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

Але я отримую цю помилку:

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

Відповіді:


267

Вам потрібен -ExecutionPolicyпараметр:

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

Інакше PowerShell розглядає аргументи, які слід виконати рядком, і поки Set-ExecutionPolicy це командлет, у нього немає -Fileпараметра.


2
@joey, це спрацювало спасибі ... але після запуску файлу bat я отримав цю помилку "Waring: колонка" команда "не вписується в дисплей і була видалена"
Ека

Це попередження, а не помилка. І більше теми для іншого питання.
Джої

@joey, чи розумно написати ще одне запитання в stack.SE для цього незначного попередження?
Ека

2
@Joey Haha, настільки ефективно ви можете змінити цю політику, не будучи адміністратором. Це питання безпеки?
Колобський каньйон

2
@KolobCanyon: Якщо ви в змозі запустити PowerShell, ви також можете зробити майже все інше. Зауважте, що політика виконання не означає, що PowerShell має більше привілеїв, ніж це було б інакше. Певним чином це просто зручність уникнути випадкових запуску речей, які ви, можливо, не хочете запускати. Аналогічно командам префікса в поточному каталозі з ./і має прапор, що виконується, на Unix.
Joey

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 в тому самому каталозі, як описано в моєму дописі.


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.
смертельної собаки

1
@Belun Посилання в блозі, на яке посилається, показує, як передавати параметри сценарію.
смертельної собаки

19

Якщо ви хочете запустити з поточного каталогу без повністю кваліфікованого шляху, ви можете використовувати:

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

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

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"

Останній рядок видаляє створений тимчасовий файл.


1

Якщо ваш скрипт входу в PowerShell працює на 5 серверах (як у мене) на сервері 2012 року, на сервері є налаштування GPO - "Налаштувати сценарій входу затримка", налаштування за замовчуванням "не налаштовано", це залишить 5-хвилинну затримку перед запуском сценарію входу.


1

Невеликий зразок тесту.см

<# :
  @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...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.