Comment exécuter un script PowerShell à partir d'un fichier batch
j'essaie d'exécuter ce script dans PowerShell. J'ai enregistré le script ci-dessous comme ps.ps1
sur mon bureau.
$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:Program Filesabc.exe"}
j'ai créé un script par lot pour exécuter ce script PowerShell
@echo off
Powershell.exe set-executionpolicy remotesigned -File C:UsersSEDesktopps.ps1
pause
Mais j'obtiens cette erreur:
6 réponses
vous avez besoin du paramètre -ExecutionPolicy
:
Powershell.exe -executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
sinon PowerShell considère les arguments comme une ligne à exécuter et bien que Set-ExecutionPolicy
soit un cmdlet, il n'a pas de paramètre -File
.
j'explique à la fois pourquoi vous voulez appeler un script PowerShell à partir d'un fichier batch et comment le faire dans mon billet de blog ici .
c'est essentiellement ce que vous recherchez:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"
et si vous devez exécuter votre script PowerShell en tant qu'Administrateur, Utilisez ceci:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"
au lieu de coder le chemin entier vers le script PowerShell, je recommande de placer le fichier batch et Fichier de script PowerShell dans le même répertoire, comme mon blog le décrit.
si vous exécutez un fichier batch appelant PowerShell comme administrateur, vous feriez mieux de l'exécuter comme ceci, vous épargnant tous les problèmes:
powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"
il est préférable d'utiliser Bypass
...
si vous voulez exécuter depuis le répertoire courant sans chemin entièrement qualifié, vous pouvez utiliser:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
si votre script de connexion PowerShell tourne après 5 minutes (comme le mien l'était) sur un serveur 2012, il y a un paramètre GPO sur un serveur - 'Configure Login script Delay' le paramètre par défaut 'non configuré' cela laissera un délai de 5 minutes avant d'exécuter le script de connexion.
si vous voulez exécuter quelques scripts, vous pouvez utiliser Set-executionpolicy -ExecutionPolicy Unrestricted
puis réinitialiser avec Set-executionpolicy -ExecutionPolicy Default
.
notez que la Politique d'exécution n'est vérifiée que lorsque vous commencez son exécution (ou du moins c'est ce qu'il semble) et vous pouvez donc exécuter des travaux en arrière-plan et réinitialiser la Politique d'exécution immédiatement.
# 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