Я пытаюсь запустить этот script в PowerShell. Я сохранил ниже script как ps.ps1
на рабочем столе.
$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}
Я сделал пакет script для запуска этого PowerShell script
@echo off
Powershell.exe set-executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
pause
Но я получаю эту ошибку:
![Enter image description here]()
Ответ 1
Вам нужен параметр -ExecutionPolicy
:
Powershell.exe -executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
В противном случае PowerShell рассматривает аргументы, которые выполняет строка, и пока Set-ExecutionPolicy
является командлетом, он не имеет параметра -File
.
Ответ 2
Я объясню, почему вы хотели бы вызвать PowerShell script из командного файла и как это сделать в моем сообщении в блоге здесь.
Это в основном то, что вы ищете:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"
И если вам нужно запустить PowerShell script в качестве администратора, используйте это:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"
Вместо жесткого кодирования всего пути к PowerShell script, хотя я рекомендую размещать командный файл и файл PowerShell script в том же каталоге, как описано в моем блоге.
Ответ 3
Если вы запускаете командный файл, вызывающий PowerShell в качестве администратора, вам лучше запустить его так, чтобы сохранить все проблемы:
powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"
Лучше использовать Bypass
...
Ответ 4
Если вы хотите запустить из текущего каталога без полного пути, вы можете использовать:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
Ответ 5
Если вы хотите запустить несколько скриптов, вы можете использовать Set-executionpolicy -ExecutionPolicy Unrestricted
, а затем reset с Set-executionpolicy -ExecutionPolicy Default
.
Обратите внимание, что политика выполнения проверяется только при запуске ее выполнения (или, как кажется), и поэтому вы можете сразу запускать задания в фоновом режиме и reset политику выполнения.
# 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
Ответ 6
Другой простой способ выполнить сценарий 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"
Последняя строка удаляет созданный временный файл.
Ответ 7
Если ваш сценарий входа в PowerShell запускается через 5 минут (как у меня) на сервере 2012 года, на сервере есть параметр GPO - "Настройка сценария входа с задержкой", параметр по умолчанию "не настроен", это оставит 5-минутную задержку перед запуском сценария входа.
Ответ 8
Небольшой образец 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...