J'essaie d'exécuter ce script dans PowerShell. J'ai enregistré le script ci-dessous sous le nom ps.ps1
sur mon bureau.
$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}
J'ai créé un script batch pour exécuter ce script PowerShell.
@echo off
Powershell.exe set-executionpolicy remotesigned -File C:\Users\SE\Desktop\ps.ps1
pause
Mais je reçois cette erreur:
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 alors que Set-ExecutionPolicy
est une applet de commande, il ne possède aucun paramètre -File
.
J'explique à la fois pourquoi vous souhaitez appeler un script PowerShell à partir d'un fichier de commandes et comment le faire dans mon article de blog ici .
Ceci est essentiellement ce que vous recherchez:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"
Et si vous avez besoin d'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}"
Plutôt que de coder en dur l'intégralité du chemin d'accès au script PowerShell, il est conseillé de placer le fichier de commandes et le fichier de script PowerShell dans le même répertoire, comme le décrit mon article de blog.
Si vous exécutez un fichier de traitement par lots appelant PowerShell en tant qu'administrateur, exécutez-le ainsi, en évitant tous les problèmes
powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"
Il vaut mieux utiliser Bypass
...
Si vous souhaitez exécuter à partir du répertoire actuel sans chemin complet, vous pouvez utiliser:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
Si vous souhaitez exécuter quelques scripts, vous pouvez utiliser Set-executionpolicy -ExecutionPolicy Unrestricted
puis réinitialiser avec Set-executionpolicy -ExecutionPolicy Default
.
Notez que la stratégie d'exécution est uniquement vérifiée lorsque vous démarrez son exécution (du moins semble-t-il). Vous pouvez donc exécuter des travaux en arrière-plan et réinitialiser immédiatement la stratégie d'exécution.
# 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
Si votre script de connexion PowerShell est exécuté après 5 minutes (comme le mien) sur un serveur 2012, il existe un paramètre GPO sur un serveur - "Configurer le script de connexion Retarder", le paramètre par défaut "non configuré". 5 minutes de retard avant d'exécuter le script de connexion.
Un autre moyen simple d’exécuter un script ps batch est de l’intégrer simplement entre ECHO et les caractères de redirection, (> et >>), Exemple:
@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"
La dernière ligne supprime le fichier temporaire créé.
Petit échantillon 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...