J'ai un script PowerShell pour ajouter un site Web à un site de confiance dans Internet Explorer:
set-location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
set-location ZoneMap\Domains
new-item TESTSERVERNAME
set-location TESTSERVERNAME
new-itemproperty . -Name http -Value 2 -Type DWORD
Je souhaite exécuter ces commandes PowerShell à partir d'un fichier de commandes. Cela semble simple lorsque je dois exécuter une seule commande,MAISdans ce cas, j'ai une séquence de commandes connexes. Je veux éviter de créer un fichier séparé pour que le script PS puisse être appelé à partir du lot; tout doit être dans le fichier de lot.
La question qui se pose est la suivante: comment exécuter des commandes powershell (ou des instructions) à partir d’un fichier de commandes?
Voici à quoi ressemblerait le code dans un fichier de commandes (testé, fonctionne):
powershell -Command "& {set-location 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'; set-location ZoneMap\Domains; new-item SERVERNAME; set-location SERVERNAME; new-itemproperty . -Name http -Value 2 -Type DWORD;}"
Sur la base des informations de:
http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/
Tapez cmd.exe Powershell -Help
et voyez les exemples.
Cette solution est similaire à walid2mi (merci de votre inspiration), mais autorise l'entrée de console standard par la cmdlet Read-Host.
avantages:
les inconvénients:
Exemple commenté et exécutable de batch-ps-script.cmd :
<# : Begin batch (batch script is in commentary of powershell v2.0+)
@echo off
: Use local variables
setlocal
: Change current directory to script location - useful for including .ps1 files
cd %~dp0
: Invoke this file as powershell expression
powershell -executionpolicy remotesigned -Command "Invoke-Expression $([System.IO.File]::ReadAllText('%~f0'))"
: Restore environment variables present before setlocal and restore current directory
endlocal
: End batch - go to end of file
goto:eof
#>
# here start your powershell script
# example: include another .ps1 scripts (commented, for quick copy-paste and test run)
#. ".\anotherScript.ps1"
# example: standard input from console
$variableInput = Read-Host "Continue? [Y/N]"
if ($variableInput -ne "Y") {
Write-Host "Exit script..."
break
}
# example: call standard powershell command
Get-Item .
Extrait pour le fichier .cmd:
<# : batch script
@echo off
setlocal
cd %~dp0
powershell -executionpolicy remotesigned -Command "Invoke-Expression $([System.IO.File]::ReadAllText('%~f0'))"
endlocal
goto:eof
#>
# here write your powershell commands...
untested.cmd
;@echo off
;Findstr -rbv ; %0 | powershell -c -
;goto:sCode
set-location "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
set-location ZoneMap\Domains
new-item TESTSERVERNAME
set-location TESTSERVERNAME
new-itemproperty . -Name http -Value 2 -Type DWORD
;:sCode
;echo done
;pause & goto :eof
Cherchant la possibilité de mettre un script PowerShell dans un fichier de commandes, j'ai trouvé ce fil. L'idée de walid2mi n'a pas fonctionné à 100% pour mon script. Mais via un fichier temporaire, contenant le script, cela a fonctionné. Voici le squelette du fichier batch:
;@echo off
;setlocal ENABLEEXTENSIONS
;rem make from X.bat a X.ps1 by removing all lines starting with ';'
;Findstr -rbv "^[;]" %0 > %~dpn0.ps1
;powershell -ExecutionPolicy Unrestricted -File %~dpn0.ps1 %*
;del %~dpn0.ps1
;endlocal
;goto :EOF
;rem Here start your power Shell script.
param(
,[switch]$help
)