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


197

J'essaye d'exécuter ce script dans PowerShell. J'ai enregistré le script ci-dessous ps.ps1sur 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 j'obtiens cette erreur:

Entrez la description de l'image ici

Réponses:


267

Vous avez besoin du -ExecutionPolicyparamètre:

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

Sinon, PowerShell considère les arguments comme une ligne à exécuter et tant qu'il Set-ExecutionPolicy s'agit d' une applet de commande, il n'a aucun -Fileparamètre.


2
@joey cela a fonctionné merci..mais après avoir exécuté le fichier chauve-souris, j'ai eu cette erreur "Waring: la colonne 'commande' ne rentre pas dans l'affichage et a été supprimée"
Eka

C'est un avertissement, pas une erreur. Et plus d'un sujet pour une autre question.
Joey

@joey est-il sage d'écrire une autre question dans stack.SE pour cet avertissement mineur?
Eka

2
@Joey Haha, vous pouvez donc ignorer cette politique sans être administrateur. Est-ce un problème de sécurité?
Kolob Canyon

2
@KolobCanyon: Si vous êtes dans une position où vous pouvez exécuter PowerShell, vous pouvez également faire à peu près tout le reste. Notez que la stratégie d'exécution ne signifie pas que PowerShell a plus de privilèges qu'il n'en aurait autrement. D'une certaine manière, il est simplement pratique d'éviter d'exécuter accidentellement des choses que vous ne voudrez peut-être pas exécuter. Similaire à avoir à préfixer les commandes dans le répertoire courant avec ./et à avoir un indicateur exécutable sous Unix.
Joey

117

J'explique à la fois pourquoi vous voudriez appeler un script PowerShell à partir d'un fichier de commandes et comment le faire dans mon article 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}"

Plutôt que de coder en dur le chemin d'accès complet au script PowerShell, je recommande 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.


Invoke-WebRequest fonctionne correctement lorsque je tape la ligne de commande dans une fenêtre cmd, mais renvoie un 404 chaque fois que je l'exécute à partir d'un fichier de commandes. Je suis en train PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C:\_my\script.ics' -Verb RunAs}";ou powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics", ou en utilisant l'option -File à même dans un fichier .ps1 ou (New-Object Net.WebClient).DownloadFile. Des idées?
Chris

Essayez d'utiliser -ExecutionPolicy Unrestricted. Je suppose que l'option Bypass ne donne pas accès au réseau PowerShell.
deadlydog

1
@Belun Le billet de blog référencé montre comment passer des paramètres au script.
deadlydog

19

Si vous souhaitez exécuter à partir du répertoire actuel sans chemin d'accès complet, vous pouvez utiliser:

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

16

Si vous exécutez un fichier de commandes appelant PowerShell en tant qu'administrateur, vous feriez mieux de l'exécuter comme ceci, vous évitant ainsi tous les problèmes:

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

Il vaut mieux utiliser Bypass...


3

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 politique d'exécution n'est vérifiée que lorsque vous démarrez son exécution (ou du moins il semble) et que 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

2

Un autre moyen simple d'exécuter un script ps à partir d'un batch est de simplement l'incorporer entre les caractères ECHO et 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éé.


1

Si votre script de connexion PowerShell s'exécute après 5 minutes (comme le mien l'était) sur un serveur 2012, il existe un paramètre GPO sur un serveur - `` Configurer le délai du script de connexion '' le paramètre par défaut `` non configuré '' cela laissera un délai de 5 minutes avant d'exécuter le script de connexion.


1

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...
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.