web-dev-qa-db-fra.com

Comment exécuter un script PowerShell à partir d'un fichier de commandes

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:

Enter image description here

143
Eka

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.

195
Joey

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.

89
deadlydog

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...

13
Root Loop

Si vous souhaitez exécuter à partir du répertoire actuel sans chemin complet, vous pouvez utiliser:

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

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

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.

1
Neil 11111

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éé.

0
Dobbelina

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...
0
DimoN