run bat powershell command-line batch-file powershell-v2.0

run - bat powershell command



¿Cómo ejecutar los comandos de PowerShell desde un archivo por lotes? (5)

Tengo un script de PowerShell para agregar un sitio web a sitios de confianza en 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

Quiero ejecutar estos comandos de PowerShell desde un archivo por lotes. Parece simple cuando tengo que ejecutar un solo comando, PERO en este caso tengo una secuencia de comandos relacionados. Quiero evitar crear un archivo separado para que se llame al script PS desde el lote; todo debe estar en el archivo por lotes.

La pregunta es: ¿cómo ejecutar comandos (o declaraciones) de powershell desde un archivo por lotes?


Así es como se vería el código en un archivo por lotes (probado, funciona):

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;}"

Basado en la información de:

http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/


Buscando la posibilidad de poner un script powershell en un archivo por lotes, encontré este hilo. La idea de walid2mi no funcionó al 100% para mi script. Pero a través de un archivo temporal, que contiene la secuencia de comandos funcionó. Aquí está el esqueleto del archivo por lotes:

;@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 )


Escriba cmd.exe Powershell -Help y vea los ejemplos.


Esta solución es similar a walid2mi (gracias por la inspiración), pero permite la entrada de consola estándar por el cmdlet Read-Host.

pros:

  • se puede ejecutar como archivo .cmd estándar
  • solo un archivo para la secuencia de comandos batch y powershell
  • El script de powershell puede ser de varias líneas (script fácil de leer)
  • permite la entrada de la consola estándar (use el cmdlet Read-Host de forma estándar)

contras:

  • requiere la versión de powershell 2.0+

Ejemplo comentado y ejecutable 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 .

Fragmento para el archivo .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...


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