ti-enxame.com

Como executar um script do PowerShell a partir de um arquivo em lotes

Eu estou tentando executar este script no PowerShell. Salvei o script abaixo como ps.ps1 na minha área de trabalho.

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

Eu fiz um script em lotes para executar este script do PowerShell

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

Mas estou recebendo este erro:

Enter image description here

143
Eka

Você precisa do parâmetro -ExecutionPolicy:

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

Caso contrário, o PowerShell considera os argumentos como uma linha para execução e, enquanto o cmdlet Set-ExecutionPolicy is a, ele não possui o parâmetro -File.

195
Joey

Eu explico porque você gostaria de chamar um script do PowerShell de um arquivo de lote e como fazê-lo no meu post aqui .

Isso é basicamente o que você está procurando:

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

E se você precisar executar o script do PowerShell como administrador, use o seguinte:

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

Em vez de codificar todo o caminho para o script do PowerShell, recomendo colocar o arquivo de lote e o arquivo de script do PowerShell no mesmo diretório, como descreve a postagem do meu blog.

89
deadlydog

Se você executar um arquivo em lotes que chama o PowerShell como administrador, é melhor executá-lo dessa maneira, evitando todos os problemas:

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

É melhor usar Bypass...

13
Root Loop

Se você deseja executar a partir do diretório atual sem um caminho completo, é possível usar:

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

Se você deseja executar alguns scripts, você pode usar Set-executionpolicy -ExecutionPolicy Unrestricted e, em seguida, redefinir com Set-executionpolicy -ExecutionPolicy Default.

Observe que a política de execução só é verificada quando você inicia sua execução (ou assim parece) e, portanto, é possível executar tarefas em segundo plano e redefinir a política de execução imediatamente.

# 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
Nux

Se o script de login do PowerShell estiver em execução após 5 minutos (como o meu) em um servidor de 2012, há uma configuração GPO em um servidor - 'Configurar script de login em atraso', a configuração padrão 'não configurada' deixará um Atraso de 5 minutos antes de executar o script de login.

1
Neil 11111

Outra maneira fácil de executar um script ps a partir do lote é simplesmente incorporá-lo entre os caracteres ECHO e Redirection, (> e >>), Example: 

@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"

Última linha exclui o arquivo temporário criado.

0
Dobbelina